import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as npif __name__=='__main__':import torch.nn as nnimport torch.nn.functional as F#定义一个卷积神经网络class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xnet = Net()# torchvision的输出是[0,1]的PILImage图像,我们把它转换为归一化范围为[-1, 1]的张量。transform = transforms.Compose(  # transforms.Compose:组合几个变换方法,按顺序变换相应数据[transforms.ToTensor(),  # 转换一个PIL库的图片或者numpy的数组为tensor张量类型;转换从[0,255]->[0,1]transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])  # 通过平均值和标准差来标准化一个tensor图像,第一个(0.5,0.5,0.5) 即三个通道的平均值,第二个(0.5,0.5,0.5) 即三个通道的标准差值# 由于ToTensor()已经将图像变为[0,1],我们使其变为[-1,1],以第一个通道为例,# 将最大与最小值代入公式: (0-0.5)/0.5=-1; (1-0.5)/0.5=1。 其他数值同理操作,即映射到[-1,1]trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)  #数据是一批一批的取出来的,比如说trainloader第一批里面有4张图片testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')# 展示图像的函数def imshow(img):img = img / 2 + 0.5  # unnormalize:非正规化npimg = img.numpy()plt.imshow(np.transpose(npimg, (1, 2, 0)))  # 将【3,32,128】-->【32,128,3】# 获取随机数据dataiter = iter(trainloader)images, labels = dataiter.next()    # images = {Tensor:[4,3,32,32]} 其中 batch_size = 4, channel = 3, 32 * 32为图像尺寸# 展示图像imshow(torchvision.utils.make_grid(images)) # make_grid()将若干幅图像拼成一幅图像# 显示图像标签print(' '.join('%5s' % classes[labels[j]] for j in range(4)))import torch.optim as optim# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 训练网路for epoch in range(2):  # 多批次循环running_loss = 0.0for i, data in enumerate(trainloader, 0):   #从 0 开始遍历trainloader# 获取输入inputs, labels = data   # inputs为读出的 4 张图片,labels = {Tensor:(4,)}对应的是 4 张图片所对应的标签# 梯度置0optimizer.zero_grad()# 正向传播,反向传播,优化outputs = net(inputs)   # output = {Tensor:(4,10)} 表示的是 4 张图片分别对应于10个类别的概率loss = criterion(outputs, labels)   #调用了CrossEntropyLoss类中的forward()函数,def forward(self, input, target),返回类型为Tensorloss.backward() # 执行了 tensor.backward(), 其中其实是执行了torch.autograd.backward()optimizer.step()    # 更新所有的参数# 打印状态信息running_loss += loss.item() #一个元素张量可以用x.item()得到元素值if i % 2000 == 1999:    # 每2000批次打印一次print('[%d, %5d] loss: %.3f' %(epoch + 1, i + 1, running_loss / 2000))running_loss = 0.0print('Finished Training')#在测试集上测试网络dataiter = iter(testloader)images, labels = dataiter.next()# 显示图片imshow(torchvision.utils.make_grid(images))print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))outputs = net(images)   # output = {Tensor:(4,10)}# torch.max()这个函数返回的是两个值,第一个值是具体的value(我们用下划线_表示),第二个值是value所在的index(也就是predicted)# 选用下划线代表不需要用到的变量,不加_,返回的是一行中最大的数。 加_,则返回一行中最大数的位置。# torch.max(outputs, 1) : output = {Tensor:(4,10)},将output写成 4 * 10 的矩阵形式,每行的数字之和为1(10个类别的概率之和为1)#                         其中数字0表示取列的最大值(有10个类别,最终维度为10),数字1表示取行的最大值(有4个样本,每个样本有10个类别概率与之对应,取最大的概率为预测概率).# dim = 0_, predicted = torch.max(outputs, 1)    # predicted = {Tensor:(4,)}, 如得到的tensor([3, 1, 8, 0])是一个预测的4张图片的标签# ,print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]for j in range(4)))correct = 0total = 0with torch.no_grad():for data in testloader:images, labels = dataoutputs = net(images)_, predicted = torch.max(outputs.data, 1)label_size = labels.size(0)total += labels.size(0)     # labels = {Tensor:(4,)}对应的是 4 张图片所对应的标签,labels.size(0) = 4correct += (predicted == labels).sum().item()   # (predicted == labels) = ([True True True False]) 是一个 4 维 Tensor 向量,# (predicted == labels).sum() =  (3,), (predicted == labels).sum().item() = 3print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))# 查看对每一个类别的预测精度,判断对哪个类别的预测准确率更高class_correct = list(0. for i in range(10)) # 创建包含10个0的列表class_total = list(0. for i in range(10))with torch.no_grad():for data in testloader:images, labels = dataoutputs = net(images)_, predicted = torch.max(outputs, 1)test = predicted == labelsprint(predicted == labels)c = (predicted == labels).squeeze() # torch.squeeze() 对数据的维度进行压缩,去掉维数为1的的维度,是一个bool类型的tensor向量 c:tensor([False,True,True,False])for i in range(4):label = labels[i]class_correct[label] += c[i].item()  # c[i].item() 的值为True/False,这里涉及到Boolean类型的加减,若c[i].item()=True,那么class_correct[label]的值 +1,否则不变(+0)class_total[label] += 1for i in range(10):print('Accuracy of %5s : %2d %%' % (classes[i], 100 * class_correct[i] / class_total[i]))

pytorch官网教程:cifar10代码理解相关推荐

  1. [pytorch] 官网教程+注释

    pytorch官网教程+注释 Classifier import torch import torchvision import torchvision.transforms as transform ...

  2. [PyTorch] 官网教程之神经网络

    官网中文文档 神经网络 文章目录 核心代码 卷积 卷积 + 分类 网络架构 核心代码 首先介绍一下 torch.nn.Conv2d(),传入参数的含义如下: in_channels # 输入通道数 o ...

  3. pytorch官网教程:autograd代码理解

    # Autograd: 自动求导机制#PyTorch 中所有神经网络的核心是 autograd 包,torch.Tensor是这个包的核心类. #如果设置 .requires_grad 为 True, ...

  4. pytorch官网教程:tensor代码理解

    #tensor from __future__ import print_function import torch #创建一个 5x3 矩阵, 但是未初始化 x = torch.empty(5,3) ...

  5. 关于pytorch官网教程中的What is torch.nn really?(三)

    文章目录 Switch to CNN `nn.Sequential` Wrapping `DataLoader` Using your GPU Closing thoughts 原文在这里. 因为MN ...

  6. pytorch实现:Resnet模型识别花朵数据集(参考pytorch官网代码)

    pytorch实现:Resnet模型识别花朵数据集 一.pytorch实现:Resnet模型识别花朵数据集 1.1 训练模型 1.2 图像预测和可视化 1.3 对新来的数据进行处理和展示 一.pyto ...

  7. Spring Cloud学习笔记—网关Spring Cloud Gateway官网教程实操练习

    Spring Cloud学习笔记-网关Spring Cloud Gateway官网教程实操练习 1.Spring Cloud Gateway介绍 2.在Spring Tool Suite4或者IDEA ...

  8. Gem5模拟器,详解官网教程Event-driven programming(五)

    目录 一.解释一下gem5中的event-driven? 二.Creating a simple event callback (1)定义一个新的 C++ 类,并继承自 SimObject 抽象基类 ...

  9. java官网教程(基础篇)—— 基础的Java类 —— 基础 I / O

    目录 基本 Java 类 基础 I/O I/O流 字节流 字符流 缓冲流 扫描和格式化 扫描 格式化 从命令行中进行IO操作 数据流 对象流 文件 I/O(采用 NIO.2) 什么是路径? Path类 ...

最新文章

  1. java51游戏_Java作业实践(一)魔板游戏
  2. vue 判断是否位 float_VUE中条件注释法css,判断ie浏览器
  3. LeetCode 299. Bulls and Cows
  4. C链表(顺序表、静态链表区别)
  5. [Unity] ACT 战斗系统学习 3:ScriptableObject
  6. 爬虫-xpath的用法强化
  7. 几款4Gb光纤连接产品对比
  8. 亚马逊狂发智能硬件新品:全新音箱、微波炉、挂钟、家庭卫士
  9. 【webpack】使用DllPlugin拆分模块
  10. numpy——numpy.corrcoef
  11. R可能让您惊喜的10件事
  12. matlab的kron函数(kronecker乘积)
  13. SIGAR - System Information Gatherer And Reporter
  14. java笔记--多敲代码四
  15. 安卓手机上最好的3个txt阅读器
  16. 显著性检验 p-value
  17. 学习Emacs系列教程
  18. Pycharm中用Appium框架编写第一个自动化脚本
  19. [计算机数值分析]牛顿下山法求方程的根
  20. Http 调用netty 服务,服务调用客户端,伪同步响应.ProtoBuf 解决粘包,半包问题.

热门文章

  1. Lottie系列二:高级属性
  2. o.boj 1451 贪吃的Tomato
  3. C语言实现STL静态链表,先进后出的数据结构-栈 一
  4. Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件
  5. java实现多继承的三种方式
  6. 教你用TensorFlow搭建AlexNet
  7. OpenCV系列之图像的几何变换 | 十四
  8. P8002 Alice and Bob are playing a Normal Game
  9. 2022-4-9 Leetcode 1154.一年中的第几天
  10. 2022-3-26 Leetcode 239.滑动窗口最大值