系列文章目录
- pytorch学习1-数据加载以及Tensorboard可视化工具
- pytorch学习2-Transforms主要方法使用
- pytorch学习3-torchvisin和Dataloader的使用
- pytorch学习4-简易卷积实现
- pytorch学习5-最大池化层的使用
- pytorch学习6-非线性变换(ReLU和sigmoid)
- pytorch学习7-序列模型搭建
- pytorch学习8-损失函数与反向传播
- pytorch学习9-优化器学习
- pytorch学习10-网络模型的保存和加载
- pytorch学习11-完整的模型训练过程
一、训练前准备
#1.准备数据集
train_data=torchvision.datasets.CIFAR10("dada",train=True,transform=torchvision.transforms.ToTensor(),download=True)
test_data=torchvision.datasets.CIFAR10("data",train=False,transform=torchvision.transforms.ToTensor(),download=True)
#2.检查长度
train_data_size=len(train_data)
test_data_size=len(test_data)
print("训练数据集的长度为{}",format(train_data_size))
print("测试数据集的长度为{}",format(test_data_size))
#3.加载并且分割处理数据集
train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)
#定义训练的设备
device=torch.device("cuda")#使用cpu就写cpu,使用gpu就写cuda
mynn=Mynn().to(device)#这样就把模型指定了设备
#5.损失函数
loss_fn=nn.CrossEntropyLoss().to(device)
#6.优化器
learning_rate=0.1
optimzer=torch.optim.SGD(mynn.parameters(),learning_rate)
scheduler=torch.optim.lr_scheduler.ReduceLROnPlateau(optimzer,"min",patience=5)#动态调整学习率。当loss经过5个epoch还是没有下降的时候,就会调整学习率。
#7.设置训练网络的一些参数
#记录训练次数
total_train_step=0
#记录测试次数
total_test_step=0
#训练的轮数
epoch=30
#添加tensorboard
writer=SummaryWriter("model1")
二、训练与测试
for i in range(epoch):
print("----第{}轮训练开始了".format(i+1))
#8.开始训练
mynn.train()#这个不是必须的,如果模型中有某些特定层(查阅官方文档),需要写这个,否则写了也没什么用
for data in train_dataloader:
imgs,target=data
imgs=imgs.to(device)
target=target.to(device)
output=mynn(imgs)
loss=loss_fn(output,target)
#开始优化,首先把上一次梯度清0,然后进行反向传播计算参数(也就是梯度),然后更新梯度
optimzer.zero_grad()
loss.backward()
optimzer.step()
# 记录训练次数
total_train_step+=1
if total_train_step%100==0:#每一次都输出会导致数据信息太过于庞杂,所以每过一百次输出一下
writer.add_scalar("每一次的训练集损失",loss.item(),total_train_step)#add_acalar()用于向日志写入标量数据
print("训练次数{},loss={}".format(total_train_step,loss))
#动态调整学习率
scheduler.step(loss)
#9.测试步骤开始
mynn.eval()#这个不是必须的,如果模型中有某些特定层(查阅官方文档),需要写这个,否则写了也没什么用
total_test_loss=0
total_accuracy=0
with torch.no_grad():#torch.no_grad()的作用是在上下文中禁用自动梯度计算,with是上下文管理器。综合意思也就是在下面代码中禁用自动梯度计算,加快速度
for data in test_dataloader:
imgs,target=data
imgs = imgs.to(device)
target = target.to(device)
output=mynn(imgs)
loss=loss_fn(output,target)
total_test_loss+=loss.item()#xxx.item()是将tensor数据转换成标量(也就是普通数字)
#测试集上面的正确率
accuracy = (output.argmax(1) == target).sum()#argmax()函数用于选择元素最大值的位置,1代表按行看,0代表按列看。在这里,每一行的值都是对标签的预测,标签值就是他们的下标,所以选择最大值的下标,也就代表了预测的类别。计算总和是为了计算正确率,计算的是这一批的总和
total_accuracy+=accuracy#累加每一批的正确个数,最终会得到测试集上面的所有样本的正确个数
print("第{}轮训练后,在测试集上的整体的损失为{}".format(i+1,total_test_loss))
print("第{}轮训练后,测试集上面的正确率:{}".format(i+1,total_accuracy/test_data_size))
writer.add_scalar("每一轮的测试集损失",total_test_loss,total_test_step)
writer.add_scalar("测试的正确率",total_accuracy/test_data_size,total_test_step)
total_test_step+=1
#10.保存每一轮的模型
torch.save(mynn,"mynn1_{}.pth".format(i+1))
print("模型已保存")
writer.close()
总结
以上就是今天要讲的内容,一个完整的可运行的模型训练过程