当前位置:   article > 正文

小土堆Pytorch笔记P30、31

小土堆Pytorch笔记P30、31

编程基础很弱,需要机器学习,学习记录,按自己理解写的,希望以后能学懂吧,要是有大神看到还请赐教。

利用GPU训练(一)

在原来代码的基础上修改一部分就可以了,具有两种方式让代码在GPU上进行训练。

方式1:

在代码中找到”网络模型“、”数据(输入,标注)“、”损失函数“;使用.cuda()然后再返回。

  1. import torch.optim
  2. import torchvision.datasets
  3. from torch.utils.tensorboard import SummaryWriter
  4. # from modelCIFAR10 import *
  5. from torch import nn
  6. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
  7. from torch.utils.data import DataLoader
  8. # 准备数据集
  9. train_data = torchvision.datasets.CIFAR10(root='./dataset', train=True, transform=torchvision.transforms.ToTensor(),
  10. download=True)
  11. test_data = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor(),
  12. download=True)
  13. # 看看数据集多大
  14. train_data_size = len(train_data)
  15. test_data_size = len(test_data)
  16. print(train_data_size)
  17. print(test_data_size)
  18. # 加载数据集
  19. train_dataloader = DataLoader(train_data, batch_size=64)
  20. test_dataloader = DataLoader(test_data, batch_size=64)
  21. # 创建网络模型
  22. class Tudui(nn.Module):
  23. def __init__(self):
  24. super(Tudui, self).__init__()
  25. self.model1 = nn.Sequential(
  26. nn.Conv2d(3, 32, 5, 1, 2),
  27. nn.MaxPool2d(2),
  28. nn.Conv2d(32, 32, 5, 1, 2),
  29. nn.MaxPool2d(2),
  30. nn.Conv2d(32, 64, 5, 1, 2),
  31. nn.MaxPool2d(2),
  32. nn.Flatten(),
  33. nn.Linear(64 * 4 * 4, 64),
  34. nn.Linear(64, 10)
  35. )
  36. def forward(self, x):
  37. x = self.model1(x)
  38. return x
  39. tudui = Tudui()
  40. #######################################################################
  41. # 调用GPU
  42. if torch.cuda.is_available():
  43. tudui = tudui.cuda()
  44. # 创建损失函数
  45. loss_function = nn.CrossEntropyLoss()
  46. #######################################################################
  47. # 调用GPU
  48. if torch.cuda.is_available():
  49. loss_function = loss_function.cuda()
  50. # 创建优化器
  51. learning_rate = 0.01
  52. optimizer = torch.optim.SGD(tudui.parameters(), lr=learning_rate)
  53. # 设置训练网络的一些参数
  54. total_train_step = 0 # 用这个变量记录训练的次数
  55. total_test_step = 0 # 用这个变量记录测试的次数
  56. # 设置训练的轮数
  57. epoch = 100
  58. # 添加tensorboard
  59. writer = SummaryWriter("logs")
  60. # 开始写循环
  61. for i in range(epoch):
  62. print("第{}轮训练开始".format(i + 1))
  63. # 训练步骤开始
  64. for data in train_dataloader:
  65. imgs, targets = data
  66. #######################################################################
  67. # 调用GPU
  68. if torch.cuda.is_available():
  69. imgs = imgs.cuda()
  70. targets = targets.cuda()
  71. output = tudui(imgs)
  72. loss = loss_function(output, targets)
  73. # 优化器优化模型
  74. optimizer.zero_grad()
  75. loss.backward()
  76. optimizer.step()
  77. # 记录训练次数
  78. total_train_step = total_train_step + 1
  79. # 不让它每次训练都打印
  80. if total_train_step % 100 == 0:
  81. print("训练次数{},损失值{}".format(total_train_step, loss.item()))
  82. writer.add_scalar("Train Loss", loss.item(), total_train_step)
  83. # 每轮训练完后在测试集上跑一遍,以评估是否训练好
  84. '''在测试过程中不需要对模型调优,因为是想测试这个当前模型效果,因此不需要调优'''
  85. # 测试步骤开始
  86. total_test_loss = 0
  87. total_accuracy = 0 #
  88. with torch.no_grad(): # 在with内的代码没有梯度,保证不会进行调优
  89. for data in test_dataloader:
  90. imgs, targets = data
  91. #######################################################################
  92. # 调用GPU
  93. if torch.cuda.is_available():
  94. imgs = imgs.cuda()
  95. targets = targets.cuda()
  96. outputs = tudui(imgs)
  97. loss = loss_function(outputs, targets)
  98. total_test_loss = total_test_loss + loss.item()
  99. total_test_step = total_test_step + 1
  100. accuracy = (outputs.argmax(1) == targets).sum() # 这里没太明白,回头再仔细研究一下
  101. total_accuracy = total_accuracy + accuracy #
  102. print("整体测试集loss{}".format(total_test_loss))
  103. print("整体测试集上的正确率:{}".format(total_accuracy / test_data_size))
  104. writer.add_scalar("Test Loss", total_test_loss, total_test_step)
  105. writer.add_scalar("Test accuracy", total_accuracy / test_data_size, total_test_step)
  106. # 保存每轮训练模型
  107. torch.save(tudui, "tudui_{}.pth".format(i + 1))
  108. print("模型已保存")
  109. writer.close()

使用time进行计时

  1. import time
  2. #在训练开始前
  3. start_time =time.time()
  4. #在第一次打印前
  5. end_time=time.time()
  6. print(end_time-start_time)

方式2:

.to(device)

  1. #第二种调用GPU的方式
  2. import torch.optim
  3. import torchvision.datasets
  4. from torch.utils.tensorboard import SummaryWriter
  5. # from modelCIFAR10 import *
  6. from torch import nn
  7. from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
  8. from torch.utils.data import DataLoader
  9. # 准备数据集
  10. train_data = torchvision.datasets.CIFAR10(root='./dataset', train=True, transform=torchvision.transforms.ToTensor(),
  11. download=True)
  12. test_data = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor(),
  13. download=True)
  14. #定义训练的设备
  15. device=torch.device("cuda:0")
  16. # 看看数据集多大
  17. train_data_size = len(train_data)
  18. test_data_size = len(test_data)
  19. print(train_data_size)
  20. print(test_data_size)
  21. # 加载数据集
  22. train_dataloader = DataLoader(train_data, batch_size=64)
  23. test_dataloader = DataLoader(test_data, batch_size=64)
  24. # 创建网络模型
  25. class Tudui(nn.Module):
  26. def __init__(self):
  27. super(Tudui, self).__init__()
  28. self.model1 = nn.Sequential(
  29. nn.Conv2d(3, 32, 5, 1, 2),
  30. nn.MaxPool2d(2),
  31. nn.Conv2d(32, 32, 5, 1, 2),
  32. nn.MaxPool2d(2),
  33. nn.Conv2d(32, 64, 5, 1, 2),
  34. nn.MaxPool2d(2),
  35. nn.Flatten(),
  36. nn.Linear(64 * 4 * 4, 64),
  37. nn.Linear(64, 10)
  38. )
  39. def forward(self, x):
  40. x = self.model1(x)
  41. return x
  42. tudui = Tudui()
  43. #######################################################################
  44. # 调用GPU
  45. tudui = tudui.to(device)
  46. # 创建损失函数
  47. loss_function = nn.CrossEntropyLoss()
  48. #######################################################################
  49. # 调用GPU
  50. loss_function = loss_function.to(device)
  51. # 创建优化器
  52. learning_rate = 0.01
  53. optimizer = torch.optim.SGD(tudui.parameters(), lr=learning_rate)
  54. # 设置训练网络的一些参数
  55. total_train_step = 0 # 用这个变量记录训练的次数
  56. total_test_step = 0 # 用这个变量记录测试的次数
  57. # 设置训练的轮数
  58. epoch = 100
  59. import time
  60. # 添加tensorboard
  61. writer = SummaryWriter("logs")
  62. start_time=time.time()
  63. # 开始写循环
  64. for i in range(epoch):
  65. print("第{}轮训练开始".format(i + 1))
  66. # 训练步骤开始
  67. for data in train_dataloader:
  68. imgs, targets = data
  69. #######################################################################
  70. # 调用GPU
  71. imgs = imgs.to(device)
  72. targets = targets.to(device)
  73. output = tudui(imgs)
  74. loss = loss_function(output, targets)
  75. # 优化器优化模型
  76. optimizer.zero_grad()
  77. loss.backward()
  78. optimizer.step()
  79. # 记录训练次数
  80. total_train_step = total_train_step + 1
  81. # 不让它每次训练都打印
  82. if total_train_step % 100 == 0:
  83. end_time=time.time()
  84. print(end_time-start_time)
  85. print("训练次数{},损失值{}".format(total_train_step, loss.item()))
  86. writer.add_scalar("Train Loss", loss.item(), total_train_step)
  87. # 每轮训练完后在测试集上跑一遍,以评估是否训练好
  88. '''在测试过程中不需要对模型调优,因为是想测试这个当前模型效果,因此不需要调优'''
  89. # 测试步骤开始
  90. total_test_loss = 0
  91. total_accuracy = 0 #
  92. with torch.no_grad(): # 在with内的代码没有梯度,保证不会进行调优
  93. for data in test_dataloader:
  94. imgs, targets = data
  95. #######################################################################
  96. # 调用GPU
  97. imgs = imgs.to(device)
  98. targets = targets.to(device)
  99. outputs = tudui(imgs)
  100. loss = loss_function(outputs, targets)
  101. total_test_loss = total_test_loss + loss.item()
  102. total_test_step = total_test_step + 1
  103. accuracy = (outputs.argmax(1) == targets).sum() # 这里没太明白,回头再仔细研究一下
  104. total_accuracy = total_accuracy + accuracy #
  105. print("整体测试集loss{}".format(total_test_loss))
  106. print("整体测试集上的正确率:{}".format(total_accuracy / test_data_size))
  107. writer.add_scalar("Test Loss", total_test_loss, total_test_step)
  108. writer.add_scalar("Test accuracy", total_accuracy / test_data_size, total_test_step)
  109. # 保存每轮训练模型
  110. torch.save(tudui, "tudui_{}.pth".format(i + 1))
  111. print("模型已保存")
  112. writer.close()

常见写法:

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

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

闽ICP备14008679号