前言

原文翻译自:Deep Learning with PyTorch: A 60 Minute Blitz

翻译:林不清(https://www.zhihu.com/people/lu-guo-92-42-88)

目录

60分钟入门PyTorch(一)——Tensors

60分钟入门PyTorch(二)——Autograd自动求导

60分钟入门Pytorch(三)——神经网络

60分钟入门PyTorch(四)——训练一个分类器

神经网络

可以使用torch.nn包来构建神经网络. 你已知道autograd包,nn包依赖autograd包来定义模型并求导.一个nn.Module包含各个层和一个forward(input)方法,该方法返回output.

例如,我们来看一下下面这个分类数字图像的网络.

neural

他是一个简单的前馈神经网络,它接受一个输入,然后一层接着一层的输入,直到最后得到结果。

神经网络的典型训练过程如下:

  • 定义神经网络模型,它有一些可学习的参数(或者权重);

  • 在数据集上迭代;

  • 通过神经网络处理输入;

  • 计算损失(输出结果和正确值的差距大小)

  • 将梯度反向传播会网络的参数;

  • 更新网络的参数,主要使用如下简单的更新原则:weight = weight - learning_rate * gradient

定义网络

我们先定义一个网络:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass Net(nn.Module):def __init__(self):super(Net, self).__init__()# 1 input image channel, 6 output channels, 3x3 square convolution# kernelself.conv1 = nn.Conv2d(1, 6, 3)self.conv2 = nn.Conv2d(6, 16, 3)# an affine operation: y = Wx + bself.fc1 = nn.Linear(16 * 6 * 6, 120)  # 6*6 from image dimension self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):# Max pooling over a (2, 2) windowx = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))# If the size is a square you can only specify a single numberx = F.max_pool2d(F.relu(self.conv2(x)), 2)x = x.view(-1, self.num_flat_features(x))x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xdef num_flat_features(self, x):size = x.size()[1:]  # all dimensions except the batch dimensionnum_features = 1for s in size:num_features *= sreturn num_featuresnet = Net()
print(net)
Net((conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))(conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))(fc1): Linear(in_features=576, out_features=120, bias=True)(fc2): Linear(in_features=120, out_features=84, bias=True)(fc3): Linear(in_features=84, out_features=10, bias=True)
)

你只需定义forward函数,backward函数(计算梯度)在使用autograd时自动为你创建.你可以在forward函数中使用Tensor的任何操作。

net.parameters()返回模型需要学习的参数。

params = list(net.parameters())
print(len(params))
print(params[0].size())  # conv1's .weight
10
torch.Size([6, 1, 3, 3])

构造一个随机的3232的输入,注意:这个网络(LeNet)期望的输入大小是3232.如果使用MNIST数据集来训练这个网络,请把图片大小重新调整到32*32.

input = torch.randn(1, 1, 32, 32)
out = net(input)
print(out)
tensor([[-0.0765,  0.0522,  0.0820,  0.0109,  0.0004,  0.0184,  0.1024,  0.0509,0.0917, -0.0164]], grad_fn=<AddmmBackward>)

将所有参数的梯度缓存清零,然后进行随机梯度的的反向传播.

net.zero_grad()
out.backward(torch.randn(1, 10))

注意

``torch.nn``只支持小批量输入,整个torch.nn包都只支持小批量样本,而不支持单个样本 例如,``nn.Conv2d``将接受一个4维的张量,每一维分别是(样本数*通道数*高*宽). 如果你有单个样本,只需使用`input.unsqueeze(0)`来添加其它的维数. 在继续之前,我们回顾一下到目前为止见过的所有类.

回顾

  • torch.Tensor-支持自动编程操作(如backward())的多维数组。同时保持梯度的张量。

  • nn.Module-神经网络模块.封装参数,移动到GPU上运行,导出,加载等

  • nn.Parameter-一种张量,当把它赋值给一个Module时,被自动的注册为参数.

  • autograd.Function-实现一个自动求导操作的前向和反向定义, 每个张量操作都会创建至少一个Function节点,该节点连接到创建张量并对其历史进行编码的函数。

现在,我们包含了如下内容:

  • 定义一个神经网络

  • 处理输入和调用backward

剩下的内容:

  • 计算损失值

  • 更新神经网络的权值

损失函数

一个损失函数接受一对(output, target)作为输入(output为网络的输出,target为实际值),计算一个值来估计网络的输出和目标值相差多少。

在nn包中有几种不同的损失函数.一个简单的损失函数是:nn.MSELoss,它计算输入和目标之间的均方误差。

例如:

output = net(input)
target = torch.randn(10)  # a dummy target, for example
target = target.view(1, -1)  # make it the same shape as output
criterion = nn.MSELoss()loss = criterion(output, target)
print(loss)
tensor(1.5801, grad_fn=<MseLossBackward>)

现在,你反向跟踪loss,使用它的.grad_fn属性,你会看到向下面这样的一个计算图: input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d -> view -> linear -> relu -> linear -> relu -> linear -> MSELoss -> loss

所以, 当你调用loss.backward(),整个图被区分为损失以及图中所有具有requires_grad = True的张量,并且其.grad 张量的梯度累积。

为了说明,我们反向跟踪几步:

print(loss.grad_fn)  # MSELoss
print(loss.grad_fn.next_functions[0][0])  # Linear
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])  # ReLU
<MseLossBackward object at 0x0000023193A40E08>
<AddmmBackward object at 0x0000023193A40E48>
<AccumulateGrad object at 0x0000023193A40E08>

反向传播

为了反向传播误差,我们所需做的是调用loss.backward().你需要清除已存在的梯度,否则梯度将被累加到已存在的梯度。

现在,我们将调用loss.backward(),并查看conv1层的偏置项在反向传播前后的梯度。

net.zero_grad()     # zeroes the gradient buffers of all parametersprint('conv1.bias.grad before backward')
print(net.conv1.bias.grad)loss.backward()print('conv1.bias.grad after backward')
print(net.conv1.bias.grad)
conv1.bias.grad before backward
tensor([0., 0., 0., 0., 0., 0.])
conv1.bias.grad after backward
tensor([ 0.0013,  0.0068,  0.0096,  0.0039, -0.0105, -0.0016])

现在,我们知道了该如何使用损失函数

稍后阅读:

神经网络包包含了各种用来构成深度神经网络构建块的模块和损失函数,一份完整的文档查看这里

唯一剩下的内容:

  • 更新网络的权重

更新权重

实践中最简单的更新规则是随机梯度下降(SGD).

weight=weight−learning_rate∗gradient

我们可以使用简单的Python代码实现这个规则。

learning_rate = 0.01
for f in net.parameters():f.data.sub_(f.grad.data * learning_rate)

然而,当你使用神经网络是,你想要使用各种不同的更新规则,比如SGD,Nesterov-SGD,Adam, RMSPROP等.为了能做到这一点,我们构建了一个包torch.optim实现了所有的这些规则.使用他们非常简单:

import torch.optim as optim# create your optimizer
optimizer = optim.SGD(net.parameters(), lr=0.01)# in your training loop:
optimizer.zero_grad()   # zero the gradient buffers
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()    # Does the update

注意

观察如何使用optimizer.zero_grad()手动将梯度缓冲区设置为零。这是因为梯度是反向传播部分中的说明那样是累积的。

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑
本站知识星球“黄博的机器学习圈子”(92416895)
本站qq群704220115。
加入微信群请扫码:

【深度学习】翻译:60分钟入门PyTorch(三)——神经网络相关推荐

  1. PyTorch深度学习:60分钟入门(Translation)

    这是https://zhuanlan.zhihu.com/p/25572330的学习笔记. Tensors Tensors和numpy中的ndarrays较为相似, 因此Tensor也能够使用GPU来 ...

  2. 【深度学习】翻译:60分钟入门PyTorch(四)——训练一个分类器

    前言 原文翻译自:Deep Learning with PyTorch: A 60 Minute Blitz 翻译:林不清(https://www.zhihu.com/people/lu-guo-92 ...

  3. 可下载:60分钟入门PyTorch(中文翻译全集)

    来源:机器学习初学者本文约9500字,建议阅读20分钟官网教程翻译:60分钟入门PyTorch(全集) 前言 原文翻译自:Deep Learning with PyTorch: A 60 Minute ...

  4. PyTorch深度学习:60分钟闪电战

    使用PYTORCH进行深度学习:60分钟的闪电战 本教程的目标: 全面了解PyTorch的Tensor库和神经网络. 训练一个小型神经网络对图像进行分类 请确保您有 torch 和 torchvisi ...

  5. 【深度学习】新人如何入门Pytorch的路线?有哪些资源推荐?

    初学者如何入门Pytorch,看看过来人的建议 作者:范星.xfanplus 链接:https://www.zhihu.com/question/55720139/answer/294449487 高 ...

  6. 60分钟入门PyTorch,官方教程手把手教你训练第一个深度学习模型(附链接)

    来源:机器之心 本文约800字,建议阅读5分钟. 本文介绍了官方教程入门PyTorch的技巧训练. 近期的一份调查报告显示:PyTorch 已经力压 TensorFlow 成为各大顶会的主流深度学习框 ...

  7. 60分钟入门PyTorch,官方教程手把手教你训练第一个深度学习模型

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自机器之心. 近期的一份调查报告显示:PyTorch 已经力压 TensorFlow 成为各大顶会的主流深度学习框架.想发论文,不学 PyTor ...

  8. 60 分钟入门 PyTorch !这里有一份新手指南

    PyTorch是最优秀的深度学习框架之一,它简单优雅,非常适合入门.本文将介绍如何快速学习 PyTorch ,入门深度学习. 2017 年初,Facebook 在机器学习和科学计算工具 Torch 的 ...

  9. 60分钟入门pytorch

    文章目录 1. Pytorch 是什么 1.1 安装 1.2 张量(Tensors) 1.2.1 声明和定义 1.2.2 操作(Operations) 1.3 和 Numpy 数组的转换 1.3.1 ...

最新文章

  1. LINUX内核经典面试题
  2. Numpy.random中shuffle与permutation的区别(转)
  3. pip更新方法(win与linux)版本
  4. 卷积,DFT,FFT,图像FFT,FIR 和 IIR 的物理意义
  5. 网络:TCP通讯之 time_wait 状态
  6. U盘安装CentOS 7错误 /dev/root does not exist, could not
  7. 普通索引和唯一索引,难道还分不清
  8. java多线程内存模型_Java多线程内存模型
  9. A2DP和AVRCP蓝牙音频传输协议
  10. Address already in use: bind 端口被占用的解决办法
  11. 光干涉波谷,有可能低于绝对零度
  12. mysql编译参数详解_教你MySQL数据库的编译安装以及命令详解(5.7版本)
  13. 用户计算机安装有512m内存,安装OFFICESCAN客户端(计算机内存要求512M以上)
  14. T410s主板上的黑色塑料是散热问题的祸首
  15. Linux C++(QT) 下获取 CPU 序列号(processor serial number)
  16. Pandas sample随机抽样
  17. 双专线接入H3C防火墙无法远程到设备
  18. 模拟实现透明网桥的自学习与过滤功能
  19. jQuery之浏览器打印插件
  20. go timer和ticker使用方式

热门文章

  1. 三层架构实现增删的简单实例
  2. 修改chrome的页面背景颜色
  3. 04 Django之模板系统
  4. 使用多级分组报表展现分类数据
  5. [源码]解析 SynchronousQueue 上界,下界.. 数据保存和数据传递. 堵塞队列. 有无频繁await?...
  6. Error when loading the SDK:发现了含有元素 'd:skin' 开头的无效内容
  7. Informix IDS 11系统经管(918考试)认证指南,第 5 部分: 数据库做事器行使(5)
  8. python 共享内存变量_浅谈python多进程共享变量Value的使用tips
  9. c语言 异或_C语言经典例题来袭!5大方法告诉你答案
  10. python怎么安装tensorflow-Python使用pip安装TensorFlow模块