pytorch学习11-完整的模型训练过程

系列文章目录

  1. pytorch学习1-数据加载以及Tensorboard可视化工具
  2. pytorch学习2-Transforms主要方法使用
  3. pytorch学习3-torchvisin和Dataloader的使用
  4. pytorch学习4-简易卷积实现
  5. pytorch学习5-最大池化层的使用
  6. pytorch学习6-非线性变换(ReLU和sigmoid)
  7. pytorch学习7-序列模型搭建
  8. pytorch学习8-损失函数与反向传播
  9. pytorch学习9-优化器学习
  10. pytorch学习10-网络模型的保存和加载
  11. 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()

总结

以上就是今天要讲的内容,一个完整的可运行的模型训练过程

你可能感兴趣的:(吴恩达机器学习,pytorch,学习,人工智能)