当前位置:   article > 正文

Python从入门到实战代码行行标注----构建卷积神经网络_labels.data.view_as(pred)

labels.data.view_as(pred)

--------教程摘自b站【不愧是计算机博士唐宇迪128集课程一套搞定了我大学4年没学会的PyTorch】PyTorch从入门到实战全套课程(附带课程学习资料 )_哔哩哔哩_bilibili

  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. import torch.nn.functional as F
  5. from torchvision import datasets,transforms
  6. import matplotlib.pyplot as plt
  7. import numpy as np
  8. %matplotlib inline

 

首先读取数据

  • 分别构建训练集和测试集(验证集)
  • DataLoader来迭代取数据
  1. # 定义超参数
  2. input_size = 28 #图像的总尺寸28*28*1
  3. num_classes = 10 #标签的种类数
  4. num_epochs = 3 #训练的总循环周期
  5. batch_size = 64 #一个撮(批次)的大小,64张图片
  6. # 训练集
  7. train_dataset = datasets.MNIST(root='./data',
  8. train=True,
  9. transform=transforms.ToTensor(),
  10. download=True)
  11. # 测试集
  12. test_dataset = datasets.MNIST(root='./data',
  13. train=False,
  14. transform=transforms.ToTensor())
  15. # 构建batch数据
  16. train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
  17. batch_size=batch_size,
  18. shuffle=True)
  19. test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
  20. batch_size=batch_size,
  21. shuffle=True)

卷积网络模块构建

  • 一般卷积层,relu层,池化层可以写成一个套餐
  • 注意卷积最后结果还是一个特征图,需要把图转换成向量才能做分类或者回归任务

  1. class CNN(nn.Module):
  2. def __init__(self):
  3. super(CNN, self).__init__()
  4. self.conv1 = nn.Sequential( # 输入大小 (1, 28, 28) conv1第一个卷积模块
  5. nn.Conv2d(
  6. in_channels=1, # 灰度图
  7. out_channels=16, # 要得到几多少个特征图
  8. kernel_size=5, # 卷积核大小
  9. stride=1, # 步长
  10. padding=2, # 如果希望卷积后大小跟原来一样,需要设置padding=(kernel_size-1)/2 if stride=1
  11. ), # 输出的特征图为 (16, 28, 28)
  12. nn.ReLU(), # relu层
  13. nn.MaxPool2d(kernel_size=2), # 进行池化操作(2x2 区域), 输出结果为: (16, 14, 14)
  14. )
  15. self.conv2 = nn.Sequential( # 下一个套餐的输入 (16, 14, 14)
  16. nn.Conv2d(16, 32, 5, 1, 2), # 输出 (32, 14, 14)
  17. nn.ReLU(), # relu层
  18. nn.MaxPool2d(2), # 输出 (32, 7, 7)
  19. )
  20. self.out = nn.Linear(32 * 7 * 7, 10) # 全连接层得到的结果
  21. def forward(self, x): #前向传播
  22. x = self.conv1(x)
  23. x = self.conv2(x)
  24. x = x.view(x.size(0), -1) # flatten操作,结果为:(batch_size, 32 * 7 * 7)
  25. output = self.out(x)
  26. return output

准确率作为评估标准 

  1. def accuracy(predictions, labels):
  2. pred = torch.max(predictions.data, 1)[1] #torch.max(input,dim)的input是softmax函数输出的一个tensor(张量)
  3. dim是max函数索引的维度0/10是每列的最大值,1是每行的最大值
  4. 返回的是两个张量tensor,第一个tensor是每一行/列的最大值,第二个tensor是每一行/列的最大值的索引。在这返回的是每行最大值的索引
  5. rights = pred.eq(labels.data.view_as(pred)).sum() #view_as()返回被视作与给定的tensor相同大小的原tensor
  6. return rights, len(labels)

训练网络模型 

  1. # 实例化
  2. net = CNN()
  3. #损失函数
  4. criterion = nn.CrossEntropyLoss()
  5. #优化器
  6. optimizer = optim.Adam(net.parameters(), lr=0.001) #定义优化器,普通的随机梯度下降算法
  7. #开始训练循环
  8. for epoch in range(num_epochs):
  9. #当前epoch的结果保存下来
  10. train_rights = []
  11. for batch_idx, (data, target) in enumerate(train_loader): #针对容器中的每一个批进行循环
  12. net.train()
  13. output = net(data)
  14. loss = criterion(output, target)
  15. optimizer.zero_grad()
  16. loss.backward()
  17. optimizer.step()
  18. right = accuracy(output, target)
  19. train_rights.append(right)
  20. if batch_idx % 100 == 0:
  21. net.eval()
  22. val_rights = []
  23. for (data, target) in test_loader:
  24. output = net(data)
  25. right = accuracy(output, target)
  26. val_rights.append(right)
  27. #准确率计算
  28. train_r = (sum([tup[0] for tup in train_rights]), sum([tup[1] for tup in train_rights]))
  29. val_r = (sum([tup[0] for tup in val_rights]), sum([tup[1] for tup in val_rights]))
  30. print('当前epoch: {} [{}/{} ({:.0f}%)]\t损失: {:.6f}\t训练集准确率: {:.2f}%\t测试集正确率: {:.2f}%'.format(
  31. epoch, batch_idx * batch_size, len(train_loader.dataset),
  32. 100. * batch_idx / len(train_loader),
  33. loss.data,
  34. 100. * train_r[0].numpy() / train_r[1],
  35. 100. * val_r[0].numpy() / val_r[1]))

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

闽ICP备14008679号