PyTorch进阶之路(一):张量与梯度

选自medium

作者:Aakash N S

机器之心编译

PyTorch 是 Facebook 开发和维护的一个开源的神经网络库,近来的发展势头相当强劲,也有越来越多的开发者为其撰写教程,本文也是其中之一。这是「PyTorch: Zero to GANs」系列教程的第一篇,介绍了 PyTorch 模型的基本构件:张量和梯度。


完整系列教程包括:


  1. PyTorch 基础:张量&梯度(本文)

  2. 线性回归 & 梯度下降:https://medium.com/jovian-io/linear-regression-with-pytorch-3dde91d60b50

  3. 用 Logistic 回归进行分类:https://medium.com/jovian-io/image-classification-using-logistic-regression-in-pytorch-ebb96cc9eb79

  4. 未完待续.. (神经网络、CNN、RNN、GAN 等)


本系列教程旨在让用户更好地利用 PyTorch 学习深度学习和神经网络。本文将介绍 PyTorch 模型的基本构件:张量和梯度。

系统设置

本教程采用代码优先的方法来学习 PyTorch,你应该尝试自己运行和实验代码。我们将使用 Python 的 Anaconda 分布来安装代码库并管理虚拟环境。对于交互式编码和实验,我们将使用 Jupyter notebook。本系列所有教程的 Jupyter notebook 都可从 Jovian(Jupyter 的共享协作平台)上获取。本文的 notebook 可以从以下地址获得:https://jvn.io/aakashns/e5cfe043873f4f3c9287507016747ae5

通过在 Jupyter 内部直接运行单个命令,Jovian 使得在云端共享 Jupyter notebook 变得很容易。它还可以捕获你运行 notebook 所需的 Python 环境和库,因此任何人(包括你自己)都能复现你的研究。

操作步骤如下:

1. 根据以下指南安装 Anaconda。你可能还要将 Anaconda 二进制文件添加到 PATH 系统中,以便能够运行 conda 命令行工具。

指南地址:https://conda.io/projects/conda/en/latest/user-guide/install/index.html

2. 通过在 Mac/Linux 终端或 Windows 命令提示符下运行以下命令(不要$)来安装 jovian Python 库:


$ pip install jovian --upgrade

3. 使用 jovian clone 命令下载本文的 notebook:


$ jovian clone e5cfe043873f4f3c9287507016747ae5

这样做可以创建目录 01-pytorch-basics,包含 Jupyter notebook 和 Anaconda 环境文件夹。


$ ls 01-pytorch-basics
01-pytorch-basics.ipynb  environment.yml

4. 现在我们可以打开目录,使用 conda 通过单个命令安装所需的 Python 库(Jupyter、PyTorch 等):


$ cd 01-pytorch-basics
$ conda env update


5. 通过运行以下命令,激活虚拟环境:


$ conda activate 01-pytorch-basics

对于旧版 conda 的安装,你可能需要运行命令:source activate 01-pytorch-basics。

6. 一旦激活了虚拟环境,我们通过运行以下命令来启动 Jupyter:


$ jupyter notebook

7. 现在,你可以通过点击终端上显示的链接或访问 http://localhost:8888 来访问 Jupyter 的 web 界面。

然后,你可以点击 01-pytorch-basics.ipynb 文件夹,打开它然后运行代码。如果想自己输入代码,你还可以通过点击「New」键来创建新的 notebook。

首先导入 PyTorch:



张量

本质上来说,PyTorch 是一个处理张量的库。一个张量是一个数字、向量、矩阵或任何 n 维数组。我们用单个数字创建一个张量:


4. 是 4.0 的缩写。它用来表示你想创建浮点数的 Python(和 PyTorch)。我们可以通过检查张量的 dtype 属性来验证这一点:


我们可以试着创建复杂一点的张量:

张量可以有任何维数。每个维度有不同的长度。我们可以用张量的.shape 属性来查看每个维度的长度。


张量运算和梯度

我们可以将张量与常用的算数运算相结合。如下:


我们已经创建了 3 个张量:x、w 和 b。w 和 b 有额外的参数 requires_grad,设置为 True。一会儿就可以看看它能做什么。

通过结合这些张量,我们可以创建新的张量 y。


如预期所料,y 是值为 3 * 4 + 5 = 17 的张量。PyTorch 的特殊之处在于,我们可以自动计算 y 相对于张量(requires_grad 设置为 True)的导数,即 w 和 b。为了计算导数,我们可以在结果 y 上调用.backward 方法。


y 相对于输入张量的导数被存储在对相应张量的.grad 属性中。


如预期所料,dy/dw 的值与 x 相同(即 3),dy/db 的值为 1。注意,x.grad 的值为 None,因为 x 没有将 requires_grad 设为 True。w_grad 中的「grad」代表梯度,梯度是导数的另一个术语,主要用于处理矩阵。

与 Numpy 之间的互操作性

Numpy 是 Python 中用于数学和科学计算的流行开源库。它支持在大型多维数组上进行高效运算,拥有一个支持多个库的大型生态系统。这些库包括:

  • 用于画图、可视化的 Matplotlib

  • 用于图像和视频处理的 OpenCV

  • 用于文件 I/O 和数据分析的 Pandas

PyTorch 并没有重新创造 wheel,而是与 Numpy 很好地交互,以利用它现有的工具和库生态系统。


可以用 torch.fron_numpy 将 Numpy 数组转化为 PyTorch 张量。


接下来可以验证 Numpy 数组和 PyTorch 张量是否拥有类似的数据类型。


可以使用张量的.to_numpy 方法将 PyTorch 张量转化为 Numpy 数组。


PyTorch 和 Numpy 之间的互操作性真的非常重要,因为你要用的大部分数据集都可能被读取并预处理为 Numpy 数组。

提交及上传 notebook

最后一步是保存并利用 jovian 库提交以上工作


Jovian 将 notebook 上传到 https://jvn.io (https://jvn.io/),用以上方式为你的 notebook 捕获 Python 环境并创建可共享的链接。你可以利用这一链接分享自己的作品,让任何人都可以利用 jovian clone 命令轻松复现。Jovian 还拥有一个强大的评论界面,供你和其他人讨论及评论你 notebook 中的某个部分:


延伸阅读

PyTorch 中的张量支持很多运算,这里列出的并不详尽。如果你想了解更多关于张量和张量运算的信息,可参考以下地址:

链接:https://pytorch.org/docs/stable/tensors.html

如果你想利用交互式 Jupyter 环境的优势来进行张量实验并尝试上述的各种不同运算组合,可以尝试下面这些:

  1. 如果上面提到的例子中,一个或多个「x」、「w」或「b」是矩阵,而不是数字,该怎么办?在这种情况下,结果「y」、梯度 w.grad 和 b.grad 看起来将是怎样的?

  2. 如果「y」是用 torch.tensor 创建的矩阵,矩阵的每个元素都表示为数字张量「x」、「w」和「b」的组合,该怎么办?

  3. 如果我们有一个运算链,而不止一个运算,即 y = x * w + b, z = l * y + m, e =c * z + d,该怎么办?调用 e.backward() 会发生什么?

如果你对此感兴趣,且想了解更多关于矩阵导数的信息,可以参考:

链接:https://en.wikipedia.org/wiki/Matrix_calculus#Derivatives_with_matrices

以上,我们完成了关于 PyTorch 中张量和梯度的讨论,下一步的主题将是线性回归。

该系列文章主要受到下面两篇文章的启发:

  • Yunjey Choi,PyTorch Tutorial for Deep Learning Researchers

  • 地址:https://github.com/yunjey/pytorch-tutorial

  • Jeremy Howard,FastAI development notebooks

  • 地址:https://github.com/fastai/fastai_docs/tree/master/dev_nb

本文为编译,转载请联系本公众号获得授权

?————————————————

加入(全职记者 / 实习生):hr@jiqizhixin.com

投稿或寻求报道:content@jiqizhixin.com

广告 & 商务合作:bd@jiqizhixin.com

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新消息 消息中心
有新私信 私信列表
搜索