当前位置:   article > 正文

P27-32:完整的训练模型(Pytorch小土堆学习笔记)_maxpool2d(2)

maxpool2d(2)

先亮代码,分成了两个文件一个是model1,用于存放模型,另一个文件是train,用于数据训练以及展示等功能,这样更符合实际应用场景。

model1:

  1. import torch
  2. from torch import nn
  3. from torch.nn import Conv2d,MaxPool2d,Flatten,Linear,Sequential
  4. class qiqi(nn.Module):
  5. def __init__(self):
  6. super(qiqi, self).__init__()
  7. self.model1 = Sequential(
  8. Conv2d(3, 32, 5, padding=2), #注意有逗号
  9. MaxPool2d(2),
  10. Conv2d(32, 32, 5, padding=2),
  11. MaxPool2d(2),
  12. Conv2d(32, 64, 5, padding=2),
  13. MaxPool2d(2),
  14. Flatten(),
  15. Linear(1024, 64),
  16. Linear(64, 10)
  17. )
  18. def forward(self,x):
  19. x=self.model1(x)
  20. return x
  21. #测试一下模型
  22. if __name__ == '__main__':
  23. qq=qiqi()
  24. input = torch.ones((64,3,32,32))
  25. output = qq(input)
  26. print(output.shape)

train:

  1. import torch
  2. import torchvision
  3. from torch import nn
  4. from torch import optim
  5. from torch.nn import Conv2d,MaxPool2d,Flatten,Linear,Sequential
  6. from torch.utils.data import DataLoader
  7. from torch.utils.tensorboard import SummaryWriter
  8. from model1 import * #直接调用
  9. #准备数据集
  10. train_data = torchvision.datasets.CIFAR10(root="./dataset2", train=True, transform=torchvision.transforms.ToTensor(),
  11. download=True)
  12. test_data = torchvision.datasets.CIFAR10(root = "./dataset2",train=False, transform=torchvision.transforms.ToTensor(),
  13. download=True)
  14. #length长度
  15. train_data_size = len(train_data)
  16. test_data_size = len(test_data)
  17. print("训练数据集的长度为:{}".format(train_data_size))
  18. print("测试数据集的长度为:{}".format(test_data_size))
  19. #利用DataLoader来加载数据集
  20. train_dataloader = DataLoader(train_data,batch_size=64)
  21. test_dataloader = DataLoader(test_data,batch_size=64)
  22. #创建网络模型
  23. qq=qiqi()
  24. #损失函数
  25. loss_fn = nn.CrossEntropyLoss()
  26. #优化器
  27. learning_rate = 1e-2
  28. optimizer = torch.optim.SGD(qq.parameters(),lr=learning_rate)
  29. #设置训练网络的一些参数
  30. #记录训练的次数
  31. total_train_step = 0
  32. #记录测试的次数
  33. total_test_step = 0
  34. #训练的轮数
  35. epoch = 10
  36. writer = SummaryWriter("total_process")
  37. for i in range(epoch):
  38. print("--------第 {} 轮训练开始--------".format(i+1))
  39. #训练步骤开始
  40. qq.train() #这行代码在这里作用不大,因为模型中是一些常见的函数
  41. for data in train_dataloader:
  42. imgs,targets=data
  43. outputs = qq(imgs)
  44. loss = loss_fn(outputs,targets)
  45. #优化器优化模型
  46. optimizer.zero_grad()
  47. loss.backward()
  48. optimizer.step()
  49. total_train_step = total_train_step+1
  50. if total_train_step % 100 == 0:
  51. print("本轮用时:{}".format(end_time-start_time) )
  52. print("训练次数:{}, loss: {}".format(total_train_step,loss.item)) #这里item也可以 不用
  53. writer.add_scalar("train_loss",loss.item(),total_train_step)
  54. #测试步骤开始
  55. qq.eval() #对现在的网络层没影响,在含有bn层和dropout层的模型中有影响,因为这两个层在训练和测试是不一样的
  56. total_test_loss = 0
  57. total_accurancy = 0
  58. with torch.no_grad():
  59. for data in test_dataloader:
  60. imgs, targets = data
  61. outputs = qq(imgs)
  62. loss = loss_fn(outputs, targets)
  63. total_test_loss = total_test_loss + loss.item()
  64. accurancy = (outputs.argmax(1) == targets).sum()
  65. total_accurancy = total_accurancy + accurancy
  66. print("整体测试集上的loss:{}".format(total_test_loss))
  67. print("整体测试集上的正确率:{}".format(total_accurancy/test_data_size))
  68. writer.add_scalar("test_loss",total_test_loss,total_test_step)
  69. writer.add_scalar("test_accuracy",total_accurancy/test_data_size,total_test_step)
  70. total_test_step = total_test_step + 1
  71. torch.save(qq,"qq_{}.pth".format(i))
  72. print("模型已保存")
  73. writer.close()

补充一下正确率那一块代码的理解:

拿一个简单的二分类举例:

输出只能输出概率,第一步要在Argmax的帮助下找到最大值并归为其中一类(argmax(1)表示横着判断,argmax(0)表示竖着判断),如图所示,第一行判定分类为1,第二行判断分类为1,所以第一步处理后的结果为:[1][1];第二步,与targets进行比较分类一致为true,分类不一致为false,为true的是分类正确的,最终求和得到分类正确的数目

上面在训练和测试的过程中用train和eval是因为bn层和dropout层在训练和测试是不一样的 

运行结果 :

tensorboard展示的结果:

 

 

 

 接下来对代码进行一些升级(为了方便,将代码放在一个文件中)

使用GPU进行训练:(两种方法)

两种方法的核心理念是一致的,都是将网络模型、数据、损失函数调用cuda()

 第一个方法:

  1. #
  2. if torch.cuda.is_available():
  3. qq=qq.cuda()
  4. #
  5. if torch.cuda.is_available():
  6. loss_fn = loss_fn.cuda()
  7. #训练集和测试集中都要加入
  8. if torch.cuda.is_available():
  9. imgs = imgs.cuda()
  10. targets = targets.cuda()

第二个方法:

  1. #在一开始输入
  2. device = torch.device("cuda:0")
  3. #之后在数据(测试+训练)、模型、损失函数中分别输入
  4. qq = qq.to(device)
  5. loss_fn = loss_fn.to(device)
  6. imgs = imgs.to(device)
  7. targets = targets.to(device)

方法二的完整代码:

  1. import torch
  2. import torchvision
  3. from torch import nn
  4. from torch import optim
  5. from torch.nn import Conv2d,MaxPool2d,Flatten,Linear,Sequential
  6. from torch.utils.data import DataLoader
  7. from torch.utils.tensorboard import SummaryWriter
  8. import time
  9. #定义训练的设备
  10. device = torch.device("cuda")
  11. #准备数据集
  12. train_data = torchvision.datasets.CIFAR10(root="./dataset2", train=True, transform=torchvision.transforms.ToTensor(),
  13. download=True)
  14. test_data = torchvision.datasets.CIFAR10(root = "./dataset2",train=False, transform=torchvision.transforms.ToTensor(),
  15. download=True)
  16. #length长度
  17. train_data_size = len(train_data)
  18. test_data_size = len(test_data)
  19. print("训练数据集的长度为:{}".format(train_data_size))
  20. print("测试数据集的长度为:{}".format(test_data_size))
  21. #利用DataLoader来加载数据集
  22. train_dataloader = DataLoader(train_data,batch_size=64)
  23. test_dataloader = DataLoader(test_data,batch_size=64)
  24. #准备训练模型
  25. class qiqi(nn.Module):
  26. def __init__(self):
  27. super(qiqi, self).__init__()
  28. self.model1 = Sequential(
  29. Conv2d(3, 32, 5, padding=2), #注意有逗号
  30. MaxPool2d(2),
  31. Conv2d(32, 32, 5, padding=2),
  32. MaxPool2d(2),
  33. Conv2d(32, 64, 5, padding=2),
  34. MaxPool2d(2),
  35. Flatten(),
  36. Linear(1024, 64),
  37. Linear(64, 10)
  38. )
  39. def forward(self,x):
  40. x=self.model1(x)
  41. return x
  42. #创建网络模型
  43. qq=qiqi()
  44. qq = qq.to(device)
  45. #损失函数
  46. loss_fn = nn.CrossEntropyLoss()
  47. loss_fn = loss_fn.to(device)
  48. #优化器
  49. learning_rate = 1e-2
  50. optimizer = torch.optim.SGD(qq.parameters(),lr=learning_rate)
  51. #设置训练网络的一些参数
  52. #记录训练的次数
  53. total_train_step = 0
  54. #记录测试的次数
  55. total_test_step = 0
  56. #训练的轮数
  57. epoch = 10
  58. #记录时间
  59. start_time = time.time()
  60. writer = SummaryWriter("train_gpu2")
  61. for i in range(epoch):
  62. print("--------第 {} 轮训练开始--------".format(i+1))
  63. #训练步骤开始
  64. qq.train() #对现在的网络层没影响,在含有bn层和dropout层的模型中有影响,因为这两个层在训练和测试是不一样的
  65. for data in train_dataloader:
  66. imgs,targets = data
  67. imgs = imgs.to(device)
  68. targets = targets.to(device)
  69. outputs = qq(imgs)
  70. loss = loss_fn(outputs,targets)
  71. #优化器优化模型
  72. optimizer.zero_grad()
  73. loss.backward()
  74. optimizer.step()
  75. total_train_step = total_train_step+1
  76. if total_train_step % 100 == 0:
  77. end_time = time.time()
  78. print("本轮用时:{}".format(end_time-start_time) )
  79. print("训练次数:{}, loss: {}".format(total_train_step,loss.item())) #这里item也可以不用
  80. writer.add_scalar("train_loss",loss.item(),total_train_step)
  81. #测试步骤开始
  82. qq.eval() #对现在的网络层没影响,在含有bn层和dropout层的模型中有影响,因为这两个层在训练和测试是不一样的
  83. total_test_loss = 0
  84. total_accurancy = 0
  85. with torch.no_grad():
  86. for data in test_dataloader:
  87. imgs, targets = data
  88. imgs = imgs.to(device)
  89. targets = targets.to(device)
  90. outputs = qq(imgs)
  91. loss = loss_fn(outputs, targets)
  92. total_test_loss = total_test_loss + loss.item()
  93. accurancy = (outputs.argmax(1) == targets).sum()
  94. total_accurancy = total_accurancy + accurancy
  95. print("整体测试集上的loss:{}".format(total_test_loss))
  96. print("整体测试集上的正确率:{}".format(total_accurancy/test_data_size))
  97. writer.add_scalar("test_loss",total_test_loss,total_test_step)
  98. writer.add_scalar("test_accuracy",total_accurancy/test_data_size,total_test_step)
  99. total_test_step = total_test_step + 1
  100. torch.save(qq,"qq_{}.pth".format(i))
  101. print("模型已保存")
  102. writer.close()

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

闽ICP备14008679号