微信扫一扫
分享到朋友圈

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

作者:机器之心 来源:机器之心 公众号
分享到:

03-12

选自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

阅读38808
举报0
关注机器之心微信号:almosthuman2014

用微信扫描二维码即可关注
声明

1、头条易读遵循行业规范,任何转载的稿件都会明确标注作者和来源;
2、本文内容来自“机器之心”微信公众号,文章版权归机器之心公众号所有。

评论
更多

文章来自于公众号:

机器之心

微信号:almosthuman2014

邮箱qunxueyuan#163.com(将#换成@)
微信编辑器
免责声明
www.weixinyidu.com   免责声明
版权声明:本站收录微信公众号和微信文章内容全部来自于网络,仅供个人学习、研究或者欣赏使用。版权归原作者所有。禁止一切商业用途。其中内容并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现头条易读网站上有侵犯您的知识产权的内容,请与我们联系,我们会及时修改或删除。
本站声明:本站与腾讯微信、微信公众平台无任何关联,非腾讯微信官方网站。