当前位置:   article > 正文

完整的模型训练套路(pytorch)_python训练模型

python训练模型

(联邦学习笔记,资料来源于b站小土堆)

训练模板

1、准备数据集

2、获取数据集长度,可以用来辅助计算精确度

3、加载数据集(DataLoader)

4、搭建网络模型(一般单独一个python文件)

5、创建网络模型(实例化)

6、定义损失函数、优化器

7、设置训练网络的一些参数(如训练次数、轮数等等)

8、模型训练

具体代码实现如下(简单示例):

1、准备数据集

  1. train_data = torchvision.datasets.CIFAR10("../data",train=True,transform=torchvision.transforms.ToTensor(),download=True)
  2. test_data = torchvision.datasets.CIFAR10("../data",train=False,transform=torchvision.transforms.ToTensor(),download=True)

2、获取数据集长度

  1. #获取数据集长度,可以判断整体的测试精度
  2. train_data_len = len(train_data)
  3. test_data_len = len(test_data)
  4. print("训练数据集长度:{}".format(test_data_len))
  5. print("测试数据集长度:{}".format(train_data_len))

3、加载数据集(DataLoader)

  1. #加载数据集
  2. train_dataloader = DataLoader(train_data,batch_size=64)
  3. test_dataloader = DataLoader(test_data,batch_size=64)

4、搭建网络模型(一般单独一个python文件)

  1. import torch
  2. from torch import nn
  3. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
  4. class MyModel(nn.Module):
  5. def __init__(self):
  6. super(MyModel, self).__init__()
  7. self.conv1 = Conv2d(3,32,5,1,2)
  8. self.maxpool1 = MaxPool2d(2)
  9. self.conv2 = Conv2d(32,32,5,1,2)
  10. self.maxpool2 = MaxPool2d(2)
  11. self.conv3 = Conv2d(32,64,5,1,2)
  12. self.maxpool3 = MaxPool2d(2)
  13. self.flatten = Flatten()
  14. self.linear1 = Linear(1024,64)
  15. self.linear2 = Linear(64,10)
  16. def forward(self,x):
  17. x = self.conv1(x)
  18. x = self.maxpool1(x)
  19. x = self.conv2(x)
  20. x = self.maxpool2(x)
  21. x = self.conv3(x)
  22. x = self.maxpool3(x)
  23. x = self.flatten(x)
  24. x = self.linear1(x)
  25. x = self.linear2(x)
  26. return x

5、创建网络模型(实例化)

  1. #创建模型
  2. model = MyModel()

6、定义损失函数、优化器

  1. #定义损失函数
  2. loss_fn = nn.CrossEntropyLoss()
  3. #定义优化器
  4. #reaning_rate = 0.01
  5. #1e-2 = 1 x (10)^(-2) = 1/100 = 0.01
  6. reaning_rate = 1e-2
  7. optimer = torch.optim.SGD(model.parameters(),lr=reaning_rate)

7、设置训练网络的一些参数(如训练次数、轮数等等)

  1. #设置训练网络模型的一些参数
  2. #记录训练的次数
  3. total_train_step = 0
  4. #记录测试的次数
  5. total_test_step = 0
  6. #训练的轮数
  7. epoch = 10
  8. #添加tensorboard来绘图
  9. writer = SummaryWriter("../logs_train")

8、模型训练

  1. #训练模型
  2. for i in range(epoch):
  3. print("-------------第 {} 轮训练开始--------------".format(i+1))
  4. #训练开始
  5. for data in train_dataloader:
  6. imgs,targets = data
  7. outputs = model(imgs)
  8. loss = loss_fn(outputs,targets)
  9. #优化器优化模型
  10. #清空梯度
  11. optimer.zero_grad()
  12. #反向传播
  13. loss.backward()
  14. #更新梯度
  15. optimer.step()
  16. total_train_step = total_train_step + 1
  17. if total_train_step % 100 == 0:
  18. print("训练次数:{},Loss:{}".format(total_train_step,loss.item()))
  19. writer.add_scalar("train_loss",loss.item(),total_train_step)
  20. #测试步骤开始
  21. #在with里的代码没有梯度,不记梯度
  22. total_test_loss = 0
  23. #记录正确率
  24. total_accuracy = 0
  25. with torch.no_grad():
  26. for data in test_dataloader:
  27. imgs,targets =data
  28. outputs = model(imgs)
  29. loss = loss_fn(outputs,targets)
  30. total_test_loss = total_test_loss + loss
  31. #outputs.argmax()可以判断输出和目标是否一致,sum()求和,可以知道总共正确的个数
  32. accuracy = (outputs.argmax(1) == targets).sum()
  33. total_accuracy = total_accuracy + accuracy
  34. print("整体测试集上的Loss:{}".format(total_test_loss))
  35. print("整体测试集上的正确率:{}".format(total_accuracy/test_data_len))
  36. writer.add_scalar("test_loss",total_test_loss.item(),total_test_step)
  37. writer.add_scalar("test_acc",total_accuracy/test_data_len,total_test_step)
  38. total_test_step = total_test_step + 1
  39. #保存模型
  40. #torch.save(model.state_dict(),"model_{}.pth".format(i))
  41. torch.save(model,"model_{}.pth".format(i))
  42. print("第 {} 轮模型已保存!".format(i+1))
  43. writer.close()

完整代码:

模型单独一个py文件

  1. import torch
  2. from torch import nn
  3. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
  4. class MyModel(nn.Module):
  5. def __init__(self):
  6. super(MyModel, self).__init__()
  7. self.conv1 = Conv2d(3,32,5,1,2)
  8. self.maxpool1 = MaxPool2d(2)
  9. self.conv2 = Conv2d(32,32,5,1,2)
  10. self.maxpool2 = MaxPool2d(2)
  11. self.conv3 = Conv2d(32,64,5,1,2)
  12. self.maxpool3 = MaxPool2d(2)
  13. self.flatten = Flatten()
  14. self.linear1 = Linear(1024,64)
  15. self.linear2 = Linear(64,10)
  16. def forward(self,x):
  17. x = self.conv1(x)
  18. x = self.maxpool1(x)
  19. x = self.conv2(x)
  20. x = self.maxpool2(x)
  21. x = self.conv3(x)
  22. x = self.maxpool3(x)
  23. x = self.flatten(x)
  24. x = self.linear1(x)
  25. x = self.linear2(x)
  26. return x
  27. #测试模型
  28. if __name__=='__main__':
  29. mymodel = MyModel()
  30. #数据是64张图片,3通道,大小32x32
  31. inputs = torch.ones((64,3,32,32))
  32. outputs = mymodel(inputs)
  33. #outputs.shape=torch.Size([64,10]),返回的是64行数据,每行有10个数据,每个数据代表该图片属于该类(10个类别)的概率
  34. print(outputs.shape)

模型训练单独一个py文件:

  1. import torchvision
  2. from torch.utils.data import DataLoader
  3. from torch.utils.tensorboard import SummaryWriter
  4. from model import *
  5. from torch import nn
  6. #准备数据集
  7. train_data = torchvision.datasets.CIFAR10("../data",train=True,transform=torchvision.transforms.ToTensor(),download=True)
  8. test_data = torchvision.datasets.CIFAR10("../data",train=False,transform=torchvision.transforms.ToTensor(),download=True)
  9. #获取数据集长度,可以判断整体的测试精度
  10. train_data_len = len(train_data)
  11. test_data_len = len(test_data)
  12. print("训练数据集长度:{}".format(test_data_len))
  13. print("测试数据集长度:{}".format(train_data_len))
  14. #加载数据集
  15. train_dataloader = DataLoader(train_data,batch_size=64)
  16. test_dataloader = DataLoader(test_data,batch_size=64)
  17. #创建模型
  18. model = MyModel()
  19. #定义损失函数
  20. loss_fn = nn.CrossEntropyLoss()
  21. #定义优化器
  22. #reaning_rate = 0.01
  23. #1e-2 = 1 x (10)^(-2) = 1/100 = 0.01
  24. reaning_rate = 1e-2
  25. optimer = torch.optim.SGD(model.parameters(),lr=reaning_rate)
  26. #设置训练网络模型的一些参数
  27. #记录训练的次数
  28. total_train_step = 0
  29. #记录测试的次数
  30. total_test_step = 0
  31. #训练的轮数
  32. epoch = 10
  33. #添加tensorboard来绘图
  34. writer = SummaryWriter("../logs_train")
  35. #训练模型
  36. for i in range(epoch):
  37. print("-------------第 {} 轮训练开始--------------".format(i+1))
  38. #训练开始
  39. for data in train_dataloader:
  40. imgs,targets = data
  41. outputs = model(imgs)
  42. loss = loss_fn(outputs,targets)
  43. #优化器优化模型
  44. #清空梯度
  45. optimer.zero_grad()
  46. #反向传播
  47. loss.backward()
  48. #更新梯度
  49. optimer.step()
  50. total_train_step = total_train_step + 1
  51. if total_train_step % 100 == 0:
  52. print("训练次数:{},Loss:{}".format(total_train_step,loss.item()))
  53. writer.add_scalar("train_loss",loss.item(),total_train_step)
  54. #测试步骤开始
  55. #在with里的代码没有梯度,不记梯度
  56. total_test_loss = 0
  57. #记录正确率
  58. total_accuracy = 0
  59. with torch.no_grad():
  60. for data in test_dataloader:
  61. imgs,targets =data
  62. outputs = model(imgs)
  63. loss = loss_fn(outputs,targets)
  64. total_test_loss = total_test_loss + loss
  65. #outputs.argmax()可以判断输出和目标是否一致,sum()求和,可以知道总共正确的个数
  66. accuracy = (outputs.argmax(1) == targets).sum()
  67. total_accuracy = total_accuracy + accuracy
  68. print("整体测试集上的Loss:{}".format(total_test_loss))
  69. print("整体测试集上的正确率:{}".format(total_accuracy/test_data_len))
  70. writer.add_scalar("test_loss",total_test_loss.item(),total_test_step)
  71. writer.add_scalar("test_acc",total_accuracy/test_data_len,total_test_step)
  72. total_test_step = total_test_step + 1
  73. #保存模型
  74. #torch.save(model.state_dict(),"model_{}.pth".format(i))
  75. torch.save(model,"model_{}.pth".format(i))
  76. print("第 {} 轮模型已保存!".format(i+1))
  77. writer.close()

(如有不同意见,欢迎留下评论,我见到了会第一时间回复)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/849376
推荐阅读
相关标签
  

闽ICP备14008679号