torch: 资源 | Yoshua Bengio 实验室 MILA 开放面向初学者的 Py

dongkaishan 坐标: 88234 目录:婚姻家庭

从概念上来说,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 新生准备的入门级教程,所以我们有理由相信与期待该项目还会继续完善与更新。

专题栏目
最新