从概念上来说,Autograd 会维护一个图并记录对变量执行的所有运算。这会产生一个有向无环图,其中叶结点为输入向量,根结点为输出向量。通过从根结点到叶结点追踪图的路径,我们可以轻易地使用链式法则自动计算梯度。以下展示了 PyTorch 的动态计算图。
图片源自 PyTorch 文档
在内部,Autograd 将这个图表征为 Function 对象的图,并且可以应用 apply ( ) 计算评估图的结果。在计算前向传播中,当 Autograd 在执行请求的计算时,它还会同时构建一个表征梯度计算的图,且每个 Variable 的 .grad_fn 属性就是这个图的输入单元。在前向传播完成后,我们可以在后向传播中根据这个动态图来计算梯度。
以下展示了通过 backward ( ) 和 torch.autograd.grad 计算梯度的方法,其中 torch.eq ( ) 评估表达式是不是相等,即 x.grad 的计算结果是不是等于 2x。
x = Variable ( torch.Tensor ( 5, 3 ) .uniform_ ( -1, 1 ) , requires_grad=True )
y = Variable ( torch.Tensor ( 5, 3 ) .uniform_ ( -1, 1 ) , requires_grad=True )
z = x ** 2 + 3 * y
z.backward ( gradient=torch.ones ( 5, 3 ) )
# eq computes element-wise equality
torch.eq ( x.grad, 2 * x )
----------------------------------------------------------------------
Variable containing:
1 1 1
[ torch.ByteTensor of size 5x3 ]
以下展示了对 y 求导的结果,即 dz/dy。从上面 z 的定义可知结果应该是 3,那么以下展示了该计算过程:
y.grad
-------------------------------
3 3 3
前面是使用 backward ( ) 求解变量的梯度,后面我们也可以使用 torch.autograd.grad 计算梯度。如下所示,我们使用另外一种方式求解同一个函数的梯度。
dz_dx = torch.autograd.grad ( z, x, grad_outputs=torch.ones ( 5, 3 ) )
dz_dy = torch.autograd.grad ( z, y, grad_outputs=torch.ones ( 5, 3 ) )
该项目在后面还了一系列的入门级教程,例如 Torch 神经网络 API 的简介、通过卷积网络和 ResNet 进行图像识别任务、神经机器翻译的基础和生成对抗网络的实现等。以下将只简要地展示这些章节所述的内容。
在 Torch 神经网络 API 简介中,MILA 展示了很多常用的 API 及意义,如下展示了部分 torch.nn 的 API。
我们一般可以使用 torch.nn 包构建神经网络,下面了一些 API 的表达及意义:
线性层 - nn.Linear、nn.Bilinear
卷积层 - nn.Conv1d、nn.Conv2d、nn.Conv3d、nn.ConvTranspose2d
非线性激活函数 - nn.Sigmoid、nn.Tanh、nn.ReLU、nn.LeakyReLU
池化层 - nn.MaxPool1d、nn.AveragePool2d
循环网络 - nn.LSTM、nn.GRU
归一化 - nn.BatchNorm2d
Dropout - nn.Dropout、nn.Dropout2d
嵌入 - nn.Embedding
损失函数 - nn.MSELoss、nn.CrossEntropyLoss、nn.NLLLoss
而在图像识别分类任务的章节中,MILA 先描述了如何构建一个简单的图像分类模型。然后再简单地构建了一个残差模块和残差网络,该残差网络可用于 CIFAR 图像识别。
以下给出了简单卷积网络的整体架构,在该架构中,我们可以简单地堆叠一些层级而完成强大的分类模型。这种贯序模型的结构十分清晰,我们可以直接重复地堆叠卷积层、Dropout 层、激活层和最大池化层完成整个推断结构。
class Classifier ( nn.Module ) :
"""Convnet Classifier"""
def __init__ ( self ) :
super ( Classifier, self ) .__init__ ( )
self.conv = nn.Sequential (
# Layer 1
nn.Conv2d ( in_channels=1, out_channels=16, kernel_size= ( 3, 3 ) , padding=1 ) ,
nn.Dropout ( p=0.5 ) ,
nn.ReLU ( ) ,
nn.MaxPool2d ( kernel_size= ( 2, 2 ) , stride=2 ) ,
# Layer 2
nn.Conv2d ( in_channels=16, out_channels=32, kernel_size= ( 3, 3 ) , padding=1 ) ,
# Layer 3
nn.Conv2d ( in_channels=32, out_channels=64, kernel_size= ( 3, 3 ) , padding=1 ) ,
# Layer 4
nn.Conv2d ( in_channels=64, out_channels=128, kernel_size= ( 3, 3 ) , padding=1 ) ,
nn.MaxPool2d ( kernel_size= ( 2, 2 ) , stride=2 )
)
# Logistic Regression
self.clf = nn.Linear ( 128, 10 )
def forward ( self, x ) :
return self.clf ( self.conv ( x ) .squeeze ( ) )
在后面部分中,MILA 同样详细展示了如何构建机器翻译系统和生成对抗网络。我们可以按照教程定义一个 DCGAN 生成器,该生成器的架构为:
( deconv1 ) : ConvTranspose2d ( 128, 128, kernel_size= ( 4, 4 ) , stride= ( 1, 1 ) , bias=False )
( bn1 ) : BatchNorm2d ( 128, eps=1e-05, momentum=0.1, affine=True )
( deconv2 ) : ConvTranspose2d ( 128, 64, kernel_size= ( 4, 4 ) , stride= ( 2, 2 ) , padding= ( 1, 1 ) , bias=False )
( bn2 ) : BatchNorm2d ( 64, eps=1e-05, momentum=0.1, affine=True )
( deconv3 ) : ConvTranspose2d ( 64, 32, kernel_size= ( 4, 4 ) , stride= ( 2, 2 ) , padding= ( 1, 1 ) , bias=False )
( bn3 ) : BatchNorm2d ( 32, eps=1e-05, momentum=0.1, affine=True )
( deconv4 ) : ConvTranspose2d ( 32, 1, kernel_size= ( 4, 4 ) , stride= ( 2, 2 ) , padding= ( 3, 3 ) , bias=False )
根据 MILA 教程定义的 DCGAN 判别器架构为:
( conv1 ) : Conv2d ( 1, 32, kernel_size= ( 4, 4 ) , stride= ( 2, 2 ) , padding= ( 1, 1 ) , bias=False )
( bn1 ) : BatchNorm2d ( 32, eps=1e-05, momentum=0.1, affine=True )
( conv2 ) : Conv2d ( 32, 64, kernel_size= ( 4, 4 ) , stride= ( 2, 2 ) , padding= ( 1, 1 ) , bias=False )
( conv3 ) : Conv2d ( 64, 128, kernel_size= ( 4, 4 ) , stride= ( 2, 2 ) , padding= ( 1, 1 ) , bias=False )
( bn3 ) : BatchNorm2d ( 128, eps=1e-05, momentum=0.1, affine=True )
( conv4 ) : Conv2d ( 128, 1, kernel_size= ( 4, 4 ) , stride= ( 2, 2 ) , padding= ( 1, 1 ) , bias=False )
以上是该教程的基本内容,更加详细的内容请查看 MILA PyTorch 教程与 PyTorch 官方教程和文档。从 MILA 对该项目的描述中,它是一个为 MILA 新生准备的入门级教程,所以我们有理由相信与期待该项目还会继续完善与更新。
- 张大千擅长:下列哪一位著名画家擅长画虎A、张
- 中通400客服电话
- 怎么换身份证上的照片
- 专硕和学硕代码
- 中国法律还有死刑吗
- 在六点半用英语怎么说
- 主任医师是什么级别
- 知困下一句:人心齐泰山移人心散请问下一句是什么
- 怎么缩小电脑桌面图标
- 专业技术岗位:事业单位管理岗位如何转专业技术岗位
- 天龙八部中逍遥派
- 苹果平板忘记id及密码怎么办
- 可可以加什么偏旁
- 什么夺目成语四字词语
- 蛋挞底皮酥脆的诀窍
- 中国联通电话号码客服电话是
- 星星还是那颗星星歌曲
- 顺丰有单号查不到物流
- iphone设置短信中心号码失败
- oppo自动开关机在哪里设置
- 灭楚之战有多惨
- 迂回什么折成语
- 案件到法院多久能开庭
- 武汉人流俱佳都巿
- 春雨绵绵的意思
- b的大写字母怎么写
- 物什么什么什么成语
- 现任国家副主席都有谁
- 打印表格怎么铺满a4纸
- 一什么玻璃填量词