什么网站可以做进出口买卖,百度广告怎么做,安心互联网保险,做网站的公司主营成本应该写啥pytorch完整的模型训练流程 1. 流程1. 整理训练数据 使用CIFAR10数据集2. 搭建网络结构3. 构建损失函数4. 使用优化器5. 训练模型6. 测试数据 计算模型预测正确率7. 保存模型 2. 代码1. model.py2. train.py 3. 结果tensorboard结果以下图片 颜色较浅的线是真实计算的值#x… pytorch完整的模型训练流程 1. 流程1. 整理训练数据 使用CIFAR10数据集2. 搭建网络结构3. 构建损失函数4. 使用优化器5. 训练模型6. 测试数据 计算模型预测正确率7. 保存模型 2. 代码1. model.py2. train.py 3. 结果tensorboard结果以下图片 颜色较浅的线是真实计算的值颜色较深的线是做了平滑处理的值训练loss测试loss测试集正确率 4. 需要注意的细节 1. 流程
1. 整理训练数据 使用CIFAR10数据集
train_data torchvision.datasets.CIFAR10(root./dataset, trainTrue, transformtorchvision.transforms.ToTensor(),downloadTrue)2. 搭建网络结构 model.py
3. 构建损失函数
loss_fn nn.CrossEntropyLoss()4. 使用优化器
learing_rate 1e-2 # 0.01
optimizer torch.optim.SGD(net.parameters(), lrlearing_rate)5. 训练模型
output net(imgs) # 数据输入模型
loss loss_fn(output, targets) # 损失函数计算损失 看计算的输出和真实的标签误差是多少
# 优化器开始优化模型 1.梯度清零 2.反向传播 3.参数优化
optimizer.zero_grad() # 利用优化器把梯度清零 全部设置为0
loss.backward() # 设置计算的损失值的钩子调用损失的反向传播计算每个参数结点的参数
optimizer.step() # 调用优化器的step()方法 对其中的参数进行优化 6. 测试数据 计算模型预测正确率
output net(imags)
# 计算测试集的正确率
preds (output.argmax(1)targets).sum()
accuracy preds
rate accuracy/len(test_data)调用模型输出tensor 数据类型的 argmax方法 argmax或获取一行或者一列数值中最大数值的下标位置argmax(0) 是从列的维度取一列数值的最大值的下标argmax(1) 是从行的维度取一行数值的最大值的下标 output.argmax(1)targets 会输出如下图最后一行 [false, ture] 对应位置相同则为true对应位置不同则为false 调用sum()方法计算求和false值为0true值为1. 最后计算得出测试集整体正确率 rate accuracy/len(test_data)
7. 保存模型
torch.save(net, ./net_epoch{}.pth.format(i))2. 代码
1. model.py
import torch
from torch import nn# 2. 搭建模型网络结构--神经网络
class Cifar10Net(nn.Module):def __init__(self):super(Cifar10Net, self).__init__()self.net nn.Sequential(nn.Conv2d(in_channels3, out_channels32, kernel_size5, stride1, padding2),nn.MaxPool2d(kernel_size2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(kernel_size2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(kernel_size2),nn.Flatten(),nn.Linear(64*4*4, 64),nn.Linear(64, 10))def forward(self, x):x self.net(x)return xif __name__ __main__:net Cifar10Net()input torch.ones((64, 3, 32, 32))output net(input)print(output.shape)2. train.py
import torch
import torchvision
from torch import nn
from torch.utils.tensorboard import SummaryWriterfrom p24_model import *# 1. 准备数据集
# 训练数据
from torch.utils.data import DataLoadertrain_data torchvision.datasets.CIFAR10(root./dataset, trainTrue, transformtorchvision.transforms.ToTensor(),downloadTrue)
# 测试数据
test_data torchvision.datasets.CIFAR10(root./dataset, trainFalse, transformtorchvision.transforms.ToTensor(),downloadTrue)# 查看数据大小--size
print(训练数据集大小, len(train_data))
print(测试数据集大小, len(test_data))
# 利用DataLoader来加载数据集
train_loader DataLoader(datasettrain_data, batch_size64)
test_loader DataLoader(datasettest_data, batch_size64)# 2. 导入模型结构 创建模型
net Cifar10Net()# 3. 创建损失函数 分类问题--交叉熵
loss_fn nn.CrossEntropyLoss()# 4. 创建优化器
# learing_rate 0.01
# 1e-2 1 * 10^(-2) 0.01
learing_rate 1e-2
print(learing_rate)
optimizer torch.optim.SGD(net.parameters(), lrlearing_rate)# 设置训练网络的一些参数
epoch 10 # 记录训练的轮数
total_train_step 0 # 记录训练的次数
total_test_step 0 # 记录测试的次数# 利用tensorboard显示训练loss趋势
writer SummaryWriter(./train_logs)for i in range(epoch):# 训练步骤开始net.train() # 可以加可以不加 只有当模型结构有 Dropout BatchNorml层才会起作用for data in train_loader:imgs, targets data # 获取数据output net(imgs) # 数据输入模型loss loss_fn(output, targets) # 损失函数计算损失 看计算的输出和真实的标签误差是多少# 优化器开始优化模型 1.梯度清零 2.反向传播 3.参数优化optimizer.zero_grad() # 利用优化器把梯度清零 全部设置为0loss.backward() # 设置计算的损失值调用损失的反向传播计算每个参数结点的参数optimizer.step() # 调用优化器的step()方法 对其中的参数进行优化# 优化一次 认为训练了一次total_train_step 1if total_train_step % 100 0:print(训练次数 {} loss {}.format(total_train_step, loss))# 直接打印loss是tensor数据类型打印loss.item()是打印的int或float真实数值 真实数值方便做数据可视化【损失可视化】# print(训练次数 {} loss {}.format(total_train_step, loss.item()))writer.add_scalar(train-loss, loss.item(), global_steptotal_train_step)# 利用现有模型做模型测试# 测试步骤开始total_test_loss 0accuracy 0net.eval() # 可以加可以不加 只有当模型结构有 Dropout BatchNorml层才会起作用with torch.no_grad():for data in test_loader:imags, targets dataoutput net(imags)loss loss_fn(output, targets)total_test_loss loss.item()# 计算测试集的正确率preds (output.argmax(1)targets).sum()accuracy preds# writer.add_scalar(test-loss, total_test_loss, global_stepi1)writer.add_scalar(test-loss, total_test_loss, global_steptotal_test_step)writer.add_scalar(test-accracy, accuracy/len(test_data), total_test_step)total_test_step 1print(---------test loss: {}--------------.format(total_test_loss))print(---------test accuracy: {}--------------.format(accuracy))# 保存每一个epoch训练得到的模型torch.save(net, ./net_epoch{}.pth.format(i))writer.close()3. 结果
训练数据集大小 50000
测试数据集大小 10000
0.01
训练次数 100 loss 2.2905373573303223
训练次数 200 loss 2.2878968715667725
训练次数 300 loss 2.258394718170166
训练次数 400 loss 2.1968581676483154
训练次数 500 loss 2.0476632118225098
训练次数 600 loss 2.002145767211914
训练次数 700 loss 2.016021728515625
---------test loss: 316.382279753685--------------
训练次数 800 loss 1.8957302570343018
训练次数 900 loss 1.8659226894378662
训练次数 1000 loss 1.9004186391830444
训练次数 1100 loss 1.9708642959594727
......tensorboard结果
安装tensorboard运行环境
pip install tensorboard
pip install opencv-python
pip install six
tensorboard --logdirtrain_logs以下图片 颜色较浅的线是真实计算的值颜色较深的线是做了平滑处理的值
训练loss 测试loss 测试集正确率 4. 需要注意的细节 https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module 所有网络层继承于torch.nn.Module net.train() net.eval() 在模型训练或测试之初 可以加可以不加 只有当模型结构有 Dropout BatchNorml层才会起作用当模型有这两个网络层的时候两个代码需要加上。