PyTorch 深度学习:60分钟快速入门

  PyTorch 深度学习:60分钟快速入门 (官方)

  [toc]

  本章为官方网站的Deep Learning with PyTorch: A 60 Minute Blitz的中文翻译,目前在网上看到所有中文翻译版本都已经过时了,所以才又重新翻译了一遍,确保与官方同步

  目录

  张量

  Autograd: 自动求导 本章是冲突的重灾区,建议阅读

  神经网络

  训练一个分类器

  选读:数据并行处理(多GPU)

  张量 1_tensor_tutorial

  PyTorch是什么?

  基于Python的科学计算包,服务于以下两种场景:

  作为NumPy的替代品,可以使用GPU的强大计算能力

  提供最大的灵活性和高速的深度学习研究平台

  Tensors(张量)

  Tensors与Numpy中的 ndarrays类似,但是在PyTorch中Tensors 可以使用GPU进行计算.

  创建一个 5x3 矩阵, 但是未初始化:

  创建一个随机初始化的矩阵:

  创建一个0填充的矩阵,数据类型为long:

  创建tensor并使用现有数据初始化:

  根据现有的张量创建张量。 这些方法将重用输入张量的属性,例如, dtype,除非设置新的值进行覆盖

  获取 size

  译者注:使用size方法与Numpy的shape属性返回的相同,张量也支持shape属性,后面会详细介绍

  Note

  ``torch.Size`` 返回值是 tuple类型, 所以它支持tuple类型的所有操作.

  操作

  操作有多种语法。

  我们将看一下加法运算。

  加法1:

  加法2

  提供输出tensor作为参数

  替换

  Note

  任何 以``_`` 结尾的操作都会用结果替换原变量. 例如: ``x.copy_(y)``, ``x.t_()``, 都会改变 ``x``.

  你可以使用与NumPy索引方式相同的操作来进行对张量的操作

  : 可以改变张量的维度和大小

  译者注:torch.view 与Numpy的reshape类似

  如果你有只有一个元素的张量,使用来得到Python数据类型的数值

  Read later:

  100+ Tensor operations, including transposing, indexing, slicing,mathematical operations, linear algebra, random numbers, etc.,are described_.

  NumPy 转换

  将一个Torch Tensor转换为NumPy数组是一件轻松的事,反之亦然。

  Torch Tensor与NumPy数组共享底层内存地址,修改一个会导致另一个的变化。

  将一个Torch Tensor转换为NumPy数组

  观察numpy数组的值是如何改变的。

  NumPy Array 转化成 Torch Tensor

  使用from_numpy自动转化

  所有的 Tensor 类型默认都是基于CPU, CharTensor 类型不支持到NumPy 的转换.

  CUDA 张量

  使用 方法 可以将Tensor移动到任何设备中

  Autograd: 自动求导机制

  ===================================

  PyTorch 中所有神经网络的核心是 包。我们先简单介绍一下这个包,然后训练第一个简单的神经网络。

  包为张量上的所有操作提供了自动求导。它是一个在运行时定义的框架,这意味着反向传播是根据你的代码来确定如何运行,并且每次迭代可以是不同的。

  示例

  张量(Tensor)

  是这个包的核心类。如果设置 为 ,那么将会追踪所有对于该张量的操作。当完成计算后通过调用 ,自动计算所有的梯度,这个张量的所有梯度将会自动积累到 属性。

  要阻止张量跟踪历史记录,可以调用方法将其与计算历史记录分离,并禁止跟踪它将来的计算记录。

  为了防止跟踪历史记录(和使用内存),可以将代码块包装在中。在评估模型时特别有用,因为模型可能具有的可训练参数,但是我们不需要梯度计算。

  在自动梯度计算中还有另外一个重要的类.

  and are interconnected and build up an acyclicgraph, that encodes a complete history of computation. Each tensor hasa attribute that references a that has createdthe (except for Tensors created by the user - their).

  和 互相连接并生成一个非循环图,它表示和存储了完整的计算历史。每个张量都有一个属性,这个属性引用了一个创建了的(除非这个张量是用户手动创建的,即,这个张量的 是 )。

  如果需要计算导数,你可以在上调用。如果是一个标量(即它包含一个元素数据)则不需要为指定任何参数,但是如果它有更多的元素,你需要指定一个 参数来匹配张量的形状。

  译者注:在其他的文章中你可能会看到说将Tensor包裹到Variable中提供自动梯度计算,Variable 这个在0.41版中已经被标注为过期了,现在可以直接使用Tensor,官方文档在这里:(https://pytorch.org/docs/stable/autograd.html#variable-deprecated)

  具体的后面会有详细说明

  创建一个张量并设置 requires_grad=True 用来追踪他的计算历史

  对张量进行操作:

  结果已经被计算出来了,所以,已经被自动生成了。

  对y进行一个操作

  可以改变现有张量的 属性。如果没有指定的话,默认输入的flag是 。

  梯度

  反向传播因为 是一个纯量(scalar), 等于。

  print gradients d(out)/dx

  得到矩阵 .将 叫做Tensor “ooo”.

  得到  $o = \frac{1}{4}\sum_i z_i$, $z_i = 3(x_i+2)^2$ 和 $z_i\bigr\rvert_{x_i=1} = 27$

  因此,

  $\frac{\partial o}{\partial x_i} = \frac{3}{2}(x_i+2)$ , 则 $\frac{\partial o}{\partial x_i}\bigr\rvert_{x_i=1} = \frac{9}{2} = 4.5$

  在数学上,如果我们有向量值函数 y⃗=f(x⃗))\vec{y} = f(\vec{x}))y⃗​=f(x⃗)) ,且 y⃗\vec{y}y⃗​ 关于 x⃗\vec{x}x⃗ 的梯度是一个雅可比矩阵(Jacobian matrix):

  $J = \begin{pmatrix} \frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_{m}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}} \end{pmatrix}$

  一般来说,就是用来计算vector-Jacobian product的工具。也就是说,给定任一向量 $v=(v_{1}\;v_{2}\;\cdots\;v_{m})^{T}$ ,计算 $v^{T}\cdot J$ ,计算 vT⋅Jv^{T}\cdot JvT⋅J ,如果 vvv 恰好是标量函数 $l=g(\vec{y})$ 的梯度,也就是说  $v=(\frac{\partial l}{\partial  y_{1}}\;\cdots\;\frac{\partial l}{\partial  y_{m}})^{T}$ ,那么根据链式法则,vector-Jacobian product 是 x⃗\vec{x}x⃗ 对 lll 的梯度:

   $J^{T}\cdot v = \begin{pmatrix} \frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{1}} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_{1}}{\partial x_{n}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}} \end{pmatrix} \begin{pmatrix} \frac{\partial l}{\partial y_{1}}\\ \vdots \\ \frac{\partial l}{\partial y_{m}} \end{pmatrix} = \begin{pmatrix} \frac{\partial l}{\partial x_{1}}\\ \vdots \\ \frac{\partial l}{\partial x_{n}} \end{pmatrix}$

  (注意,vT⋅Jv^{T}\cdot JvT⋅J 给出了一个行向量,可以通过 JT⋅vJ^{T}\cdot vJT⋅v 将其视为列向量)

  vector-Jacobian product 这种特性使得将外部梯度返回到具有非标量输出的模型变得非常方便。

  现在让我们来看一个vector-Jacobian product的例子

  在这个情形中,不再是个标量。无法直接计算出完整的雅可比行列**,但是如果我们只想要vector-Jacobian product,只需将向量作为参数传入:

  如果但是你又不希望进行autograd的计算,那么可以将变量包裹在 中:

  稍后阅读:

  和 的官方文档 https://pytorch.org/docs/autograd

  本文使用 文章同步助手 同步