# Pytorch学习之源码理解：pytorch/examples/mnists

``````from __future__ import print_function
import argparse
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.optim.lr_scheduler import StepLR

class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()#调用父类的构造方法
self.conv1 = nn.Conv2d(1, 32, 3, 1)#输入1个channel,输出32个channels,kernel_size=3,stride(步长）=1
self.conv2 = nn.Conv2d(32, 64, 3, 1)#再变成64channels
self.dropout1 = nn.Dropout2d(0.25)#以0.25的概率dropout
self.dropout2 = nn.Dropout2d(0.5)
self.fc1 = nn.Linear(9216, 128)#9216->128
self.fc2 = nn.Linear(128, 10)
#定义网络各层
def forward(self, x):
x = self.conv1(x)
#线性整流函数（Rectified Linear Unit, ReLU）是一个激活函数，这是当成一层了
#卷积神经网络中，若不采用非线性激活，会导致神经网络只能拟合线性可分的数据，因此通常会在卷积操作后，添加非线性激活单元，其中包括logistic-sigmoid、tanh-sigmoid、ReLU等。
x = F.relu(x)
x = self.conv2(x)
x = F.max_pool2d(x, 2)
x = self.dropout1(x)
x = torch.flatten(x, 1)
x = self.fc1(x)
x = F.relu(x)
x = self.dropout2(x)
x = self.fc2(x)
output = F.log_softmax(x, dim=1)
return output

def train(args, model, device, train_loader, optimizer, epoch):
model.train()
#这是两种模式
#model.train() ：启用 BatchNormalization 和 Dropout
#model.eval() ：不启用 BatchNormalization 和 Dropout
#model.eval()，pytorch会自动把BN和DropOut固定住，不会取平均，而是用训练好的值。
# 不然的话，一旦test的batch_size过小，很容易就会被BN层导致生成图片颜色失真极大；在模型测试阶段使用
for batch_idx, (data, target) in enumerate(train_loader):
#读入数据到device中，之后就用新的变量表示就可，对程序不影响（物理层和应用层）
data, target = data.to(device), target.to(device)
output = model(data)
loss = F.nll_loss(output, target)#计算loss
loss.backward()#反向传播，计算梯度和
optimizer.step()#调整参数。
#上面的方法都是共享一个参数空间的，所以不需要传递参数
if batch_idx % args.log_interval == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
100. * batch_idx / len(train_loader), loss.item()))

model.eval()
test_loss = 0
correct = 0
data, target = data.to(device), target.to(device)
output = model(data)
test_loss += F.nll_loss(output, target, reduction='sum').item()  # sum up batch loss
pred = output.argmax(dim=1, keepdim=True)  # get the index of the max log-probability
correct += pred.eq(target.view_as(pred)).sum().item()

print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(

def main():
# Training settings
#都是可选参数，是为了调参用的
parser = argparse.ArgumentParser(description='PyTorch MNIST Example')#加上参数描述，在--help中输出
help='input batch size for training (default: 64)')
help='input batch size for testing (default: 1000)')
help='number of epochs to train (default: 14)')
help='learning rate (default: 1.0)')
help='Learning rate step gamma (default: 0.7)')
help='disables CUDA training')
help='random seed (default: 1)')
help='how many batches to wait before logging training status')

help='For Saving the current Model')
args = parser.parse_args()#获取参数，从这里就可以开始调用这些参数了。没有输入也没有设置默认值的就是null,用在布尔表达式里面也可以表示false
use_cuda = not args.no_cuda and torch.cuda.is_available()#有cuda并且没设置参数说不用才用cuda

torch.manual_seed(args.seed)#设置随机种子，以便于生成随机数

device = torch.device("cuda" if use_cuda else "cpu")#决定用cpu还是GPU

kwargs = {'num_workers': 1, 'pin_memory': True} if use_cuda else {}
#载入训练集
#torchvision下的datasets模块，如果没发现本地有这个包就下载
transform=transforms.Compose([
transforms.ToTensor(),#输出tensor类型
transforms.Normalize((0.1307,), (0.3081,))#do normalize
])),
batch_size=args.batch_size, shuffle=True, **kwargs)#一次读多少
#载入测试集
datasets.MNIST('../data', train=False, transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])),
batch_size=args.test_batch_size, shuffle=True, **kwargs)
#将模型读入device
model = Net().to(device)
#等间隔调整学习率 StepLR
#等间隔调整学习率，调整倍数为 gamma 倍，调整间隔为 step_size。间隔单位是step。需要注意的是， step 通常是指 epoch，不要弄成 iteration 了。
scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma)
for epoch in range(1, args.epochs + 1):#迭代次数
train(args, model, device, train_loader, optimizer, epoch)
scheduler.step()#每次迭代之后调整学习率

if args.save_model:#保存模型
torch.save(model.state_dict(), "mnist_cnn.pt")

if __name__ == '__main__':
main()
``````

## Pytorch学习之源码理解：pytorch/examples/mnists的更多相关文章

1. Pytorch版本yolov3源码阅读

目录 Pytorch版本yolov3源码阅读 1. 阅读test.py 1.1 参数解读 1.2 data文件解析 1.3 cfg文件解析 1.4 根据cfg文件创建模块 1.5 YOLOLayer ...

2. 学习JUC源码（1）——AQS同步队列（源码分析结合图文理解）

前言 最近结合书籍<Java并发编程艺术>一直在看AQS的源码,发现AQS核心就是:利用内置的FIFO双向队列结构来实现线程排队获取int变量的同步状态,以此奠定了很多并发包中大部分实现基 ...

3. 学习JUC源码（3）——Condition等待队列（源码分析结合图文理解）

前言 在Java多线程中的wait/notify通信模式结尾就已经介绍过,Java线程之间有两种种等待/通知模式,在那篇博文中是利用Object监视器的方法(wait(),notify().notif ...

4. 手牵手，从零学习Vue源码 系列一（前言-目录篇)

系列文章: 手牵手,从零学习Vue源码 系列一(前言-目录篇) 手牵手,从零学习Vue源码 系列二(变化侦测篇) 手牵手,从零学习Vue源码 系列三(虚拟DOM篇) 陆续更新中... 预计八月中旬更新 ...

5. 【菜鸟学习jquery源码】数据缓存与data()

前言 最近比较烦,深圳的工作还没着落,论文不想弄,烦.....今天看了下jquery的数据缓存的代码,参考着Aaron的源码分析,自己有点理解了,和大家分享下.以后也打算把自己的jquery的学习心得 ...

6. 学习 vue 源码 -- 响应式原理

概述 由于刚开始学习 vue 源码,而且水平有限,有理解或表述的不对的地方,还请不吝指教. vue 主要通过 Watcher.Dep 和 Observer 三个类来实现响应式视图.另外还有一个 sch ...

7. 我该如何学习spring源码以及解析bean定义的注册

如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住 ...

8. 一起学习vue源码 - Object的变化侦测

作者:小土豆biubiubiu 博客园:www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e894d 简书:h ...

9. 手牵手，从零学习Vue源码 系列二（变化侦测篇）

系列文章: 手牵手,从零学习Vue源码 系列一(前言-目录篇) 手牵手,从零学习Vue源码 系列二(变化侦测篇) 陆续更新中... 预计八月中旬更新完毕. 1 概述 Vue最大的特点之一就是数据驱动视 ...

## 随机推荐

1. 排序算法 ----（转载：：http://blog.csdn.net/hguisu/article/details/7776068）

1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序 ...

2. Kettle6使用

3. 转:C++中 #ifdef 和#endif的作用

一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是"条件编译".有时,希望当满足某条件时对一组 ...

4. logback自定义格式转换器

创建自定义格式转换符有两步. 首先,必须继承ClassicConverter类.ClassicConverter对象负责从ILoggingEvent 提取信息,并产生一个字符串.例如,LoggerCo ...

5. 如何设置PDF签名文档，PDF签名文档怎么编辑

在工作中我们都会遇到有文件需要签名的时候,如果是在身边就直接拿笔来签名了,那么如果没有在身边又是电子文件需要签名的时候应该怎么办呢,这个时候就应该设置一个电子的签名文档,其他的文件电子文件签名很简单, ...

6. hbuilder 打包 vueAPP

1:设置状态栏颜色 在manifest.json 找到 plus 下添加 "statusbar": { "immersed": true/*沉浸式状态栏*/ 设 ...

7. Opencv学习笔记3：边缘检测算子的实现方法

一.边缘检测概念 图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘.效果如图: 接下来介绍一下边缘提取的几种算子,具体证明过程 ...

8. PHP：IIS下的PHP开发环境搭建

背景 发现书柜中有好几本PHP的图书,决定还是学学PHP,本文介绍一下在Windows环境下PHP开发环境的搭建. 运行环境搭建 下载和安装下面三个软件: IIS. http://php.iis.ne ...

9. IPL和SPL的区别