完整网络模型训练(一)

文章目录

一、网络模型的搭建

以CIFAR10数据集作为训练例子

准备数据集:

bash 复制代码
#因为CIFAR10是属于PRL的数据集,所以需要转化成tensor数据集
train_data = torchvision.datasets.CIFAR10(root="./data", train=True, transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root="./data", train=False, transform=torchvision.transforms.ToTensor(),download=True)

查看数据集的长度:

bash 复制代码
train_data_size = len(train_data)
test_data_size = len(test_data)
print(f"训练数据集的长度为{train_data_size}")
print(f"测试数据集的长度为{test_data_size}")

运行结果:

利用DataLoader来加载数据集:

bash 复制代码
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)

搭建CIFAR10数据集神经网络:

卷积层【1】代码解释:

#第一个数字3表示inputs(可以看到图中为3),第二个数字32表示outputs(图中为32)

#第三个数字5为卷积核(图中为5),第四个数字1表示步长(stride)

#第五个数字表示padding,需要计算,计算公式:

bash 复制代码
nn.Conv2d(3, 32, 5, 1, 2)

最大池化代码解释:

#数字2表示kernel卷积核

bash 复制代码
nn.MaxPool2d(2)

读图

卷积层【1】的Inputs 和 Outputs是下图这两个:

最大池化【1】的Inputs 和 Outputs是下图这两个:

卷积层【2】的Inputs 和 Outputs是下图这两个:

以此类推

展平:

Flatten后它会变成64*4 *4的一个结果

线性输出:

线性输入是64*4 *4,线性输出是64,故如下代码

nn.LInear(64 *4 *4,64)

继续线性输出

nn.LInear(64,10)

搭建网络完整代码:

bash 复制代码
class Sen(nn.Module):
    def __init__(self):
        super(Sen, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(3, 32, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, 1 ,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(64*4*4, 64),
            nn.Linear(64, 10)
        )
    def forward(self,x):
        x = self.model(x)
        return x

二、网络模型正确性检验

bash 复制代码
if __name__ == '__main__':
    sen = Sen()
    input = torch.ones((64, 3, 32, 32))
    output = sen(input)
    print(output.shape)

注释:

bash 复制代码
input = torch.ones((64, 3, 32, 32))

这一行代码的含义是:创建一个大小为 (64, 3, 32, 32) 的全 1 张量,数据类型为 torch.float32。

64:这是批次大小,代表输入有 64 张图片。

3:这是图片的通道数,通常为 RGB 图像的三个通道 (红、绿、蓝)。

32, 32:这是图片的高和宽,表示每张图片的尺寸为 32x32 像素。

torch.ones 函数用于生成一个全 1 的张量,这里的张量形状适合用于输入图像分类或卷积神经网络(CNN)中常见的 CIFAR-10 或类似的 32x32 像素图像数据。

运行结果:

可以得到成功变成了【64, 10】的结果。

三、创建网络函数

创建网络模型:

bash 复制代码
sen = Sen()

搭建损失函数:

bash 复制代码
loss_fn = nn.CrossEntropyLoss()

优化器:

bash 复制代码
learning_rate = 1e-2
optimizer = torch.optim.SGD(sen.parameters(), lr=learning_rate)

优化器注释:

使用随机梯度下降(SGD)优化器

learning_rate = 1e-2 这里的1e-2代表的是:1 x (10)^(-2) = 1/100 = 0.01

记录训练的次数:

bash 复制代码
total_train_step = 0

记录测试的次数:

bash 复制代码
total_test_step = 0

训练的轮数:

bash 复制代码
epoch= 10

进行循环训练:

bash 复制代码
for i in range(epoch):
    print(f"第{i+1}轮训练开始")

    for data in train_dataloader:
        imgs, targets = data
        outputs = sen(imgs)
        loss = loss_fn(outputs, targets)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        total_train_step = total_train_step + 1
        print(f"训练次数:{total_train_step},Loss:{loss.item()}")

注释:
imgs, targets = data是解包数据,imgs 是输入图像,targets 是目标标签(真实值)
outputs = sen(imgs)将输入图像传入模型 'sen',得到模型的预测输出 outputs
loss = loss_fn(outputs, targets)计算损失值(Loss),loss_fn 是损失函数,它比较outputs的值与targets 是目标标签(真实值)的误差
optimizer.zero_grad()清除优化器中上一次计算的梯度,以免梯度累积
loss.backward()反向传播,计算损失相对于模型参数的梯度
optimizer.step()使用优化器更新模型的参数,以最小化损失

loss.item() 将张量转换为 Python 的数值
loss.item演示:

bash 复制代码
import torch
a = torch.tensor(5)
print(a)
print(a.item())

运行结果:

因此可以得到:item的作用是将tensor变成真实数字5

本章节完整代码展示:

bash 复制代码
import torchvision.datasets
from torch import nn
from torch.utils.data import DataLoader

class Sen(nn.Module):
    def __init__(self):
        super(Sen, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(3, 32, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, 1 ,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, 1, 2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(64*4*4, 64),
            nn.Linear(64, 10)
        )
    def forward(self,x):
        x = self.model(x)
        return x
#准备数据集
#因为CIFAR10是属于PRL的数据集,所以需要转化成tensor数据集
train_data = torchvision.datasets.CIFAR10(root="./data", train=True, transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root="./data", train=False, transform=torchvision.transforms.ToTensor(),download=True)

#length长度
train_data_size = len(train_data)
test_data_size = len(test_data)
print(f"训练数据集的长度为{train_data_size}")
print(f"测试数据集的长度为{test_data_size}")

train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)

sen = Sen()

#损失函数
loss_fn = nn.CrossEntropyLoss()

#优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(sen.parameters(), lr=learning_rate)

#记录训练的次数
total_train_step = 0
#记录测试的次数
total_test_step = 0
#训练的轮数
epoch= 10

for i in range(epoch):
    print(f"第{i+1}轮训练开始")

    for data in train_dataloader:
        imgs, targets = data
        outputs = sen(imgs)
        loss = loss_fn(outputs, targets)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        total_train_step = total_train_step + 1
        print(f"训练次数:{total_train_step},Loss:{loss.item()}")

运行结果:

可以看到训练的损失函数在一直进行修正。

相关推荐
Hoper.J1 分钟前
用 LoRA 微调 Stable Diffusion:拆开炼丹炉,动手实现你的第一次 AI 绘画
人工智能·stable diffusion·lora·微调·aigc·文生图·ai绘画
正义的彬彬侠6 分钟前
正态分布的极大似然估计一个示例,详细展开的方程求解步骤
人工智能·决策树·机器学习·概率论
innutritious16 分钟前
车辆重识别(2021NIPS在图像合成方面,扩散模型打败了gans网络)论文阅读2024/10/01
论文阅读·人工智能·深度学习·计算机视觉
chusheng184018 分钟前
Python Flask 和 Django 的区别与适用场景
python·django·flask
nick987622 分钟前
信号处理之中值滤波
人工智能·算法·信号处理
行十万里人生23 分钟前
信号处理: Block Pending Handler 与 SIGKILL/SIGSTOP 实验
c++·后端·深度学习·ubuntu·serverless·信号处理·visual studio code
喝旺仔la28 分钟前
Python与MongoDB交互
开发语言·python·mongodb
MavenTalk28 分钟前
Python批量处理客户明细表格数据,挖掘更大价值
开发语言·python·表格处理
fzyz1231 小时前
手搓一个Eval#Datawhale组队学习大模型任务Task4
人工智能·深度学习·学习·机器学习
kay_5451 小时前
YOLO11改进 | 检测头 | 小目标遮挡物性能提升的检测头Detect_MultiSEAM【完整代码】
人工智能·python·深度学习·yolo·目标检测·面试·yolo11