PyTorch入门教程-阿里云开发者社区

开发者社区> 人工智能> 正文

PyTorch入门教程

简介: 本文将讲解如何入门PyTorch,包括基础原理知识、numpy与PyTorch的区别以及案例研究实例。

介绍

PyTorch是一个非常有可能改变深度学习领域前景的Python库。我尝试使用了几星期PyTorch,然后被它的易用性所震惊,在我使用过的各种深度学习库中,PyTorch是最灵活、最容易掌握的。

pytorch-logo-flat-300x210.png

在本文中,我们将讲解如何入门PyTorch,包括基础知识和案例研究。还将分别在numpy和PyTorch中从零开始构建神经网络,以了解它们在实践中的相似处与区别。

目录

·PyTorch的概述

·深入研究技术细节

·在Numpy和PyTorch中分别构建神经网络并进行对比

·与其它深度学习库比较

·案例研究——用PyTorch解决图像识别问题

PyTorch的概述

PyTorch的创始人说过他们创作的一个准则——他们想成为当务之急。这意味着我们可以立即执行计算。这正好符合Python的编程方法,不需要完成全部代码才能运行,可以轻松的运行部分代码并实时检查。对于我来说把它作为一个神经网络调试器是一件非常幸福的事。

PyTorch是一个基于Python的库,用来提供一个具有灵活性的深度学习开发平台。PyTorch的工作流程非常接近Python的科学计算库——numpy。

现在你可能会问,为什么我们要用PyTorch来建立深度学习模型呢?我可以列出三件有助于回答的事情:

·易于使用的API—它就像Python一样简单。

·Python的支持—如上所述,PyTorch可以顺利地与Python数据科学栈集成。它非常类似于numpy,甚至注意不到它们的差别。

·动态计算图—取代了具有特定功能的预定义图形,PyTorch为我们提供了一个框架,以便可以在运行时构建计算图,甚至在运行时更改它们。在不知道创建神经网络需要多少内存的情况下这非常有价值。

PyTorch的其他一些优点还包括:多gpu支持,自定义数据加载器和简化的预处理器。

自从2016年1月发布以来,许多研究人员将其作为一种“go-to”库,因为它可以轻松地构建新颖的甚至是极其复杂的图形。虽说如此,PyTorch仍有一段时间没有被大多数数据科学实践者采用,因为它是新的而且处于“正在建设”的状态。

深入技术细节

在深入讨论细节之前,让我们先看看PyTorch的工作流程。

PyTorch使用了命令式/热切的范例。也就是说,在构建一个图形时,每一行代码都定义了改图的一个组件。我们甚至能在图形构建完成前,独立的对这些组件进行计算。这就是所谓的“逐运行”方法。

dynamic_graph-768x432.gif

来源: http://pytorch.org/about/

安装PyTorch非常简单。您可以按照官方文档中提到的步骤操作,并根据您的系统规格运行命令。例如,这是我根据我选择的选项使用的命令:

3-768x368.png

在开始使用PyTorch时应该了解的主要元素:

·PyTorch张量

·数学运算

·Autograd模块

·Optim模块

·神经网络模块

下面让我们依次介绍这些元素吧。

PyTorch张量

张量只是多维数组。PyTorch中的张量类似于numpy的ndarrays,另外,张量也可以在GPU上使用。PyTorch支持各种类型的张量

你可以如下定义一个简单的一维矩阵:

8da9d95d2b4ac4c42806d7c8970b182c06378a03

数学运算

与numpy一样,科学计算库非常重要的一点是能够实现高效的数学功能。而PyTorch提供了一个类似的借口,可以使用200个以上的数学运算。

下面是在PyTorch中实现一个简单的添加操作的例子:

9b928611438a1268106b4eca1b8855f14760e5c7
这和基本的python方法非常相似。我们还可以在定义的PyTorch张量上执行各种矩阵运算。例如,我们要转置一个二维矩阵:
f0e9206f87e0e5b484cdf3c6a17275b61ee3d32f

Autograd模块

PyTorch使用了一种叫做自动微分的技术。也就是说,它会有一个记录我们所有执行操作的记录器,之后再回放记录来计算我们的梯度。这一技术在构建神经网络时尤其有效,因为我们可以通过计算前路参数的微分来节省时间。

4.png

来源: http://pytorch.org/about/

0e7c1155911f80f3f3a8e1d52556963944740708

Optim模块

Torch.optim是一个实现各种优化算法的模块,用于构建神经网络。它支持大多数常用的方法,因此我们不必从头开始构建它们。

下面是使用Adam优化器的代码:

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

神经网络模块

虽然PyTorch Autograd可以很容易的定义计算图形和使用梯度,但是对于定义复杂的神经网络来说可能有点太低级了。而这就需要神经网络模块来提供帮助。

nn包定义了一组模块,我们可以把它看作是一个神经网络层,它产生输入输出,并且可能有一些可训练的权重。

你可以把nn模块看作是PyTorch的内核!

a7e017f9a1d05503bb02c472ed39fc05107c8c1a


现在您已经了解了PyTorch的基本组件,那么可以轻松地从头构建自己的神经网络了。如果想知道怎么做,就继续往下看吧。

分别在Numpy和PyTorch中构建神经网络并比较

我之前提到过PyTorch和Numpy非常相似,现在让我们看看原因。在本节中,我们将通过实现一个简单的神经网络来解决二进制分类问题。

fbb6946e9cb1e6d660835616c522145336ea3d41

b83b5ef97d94a81103242451b1a3624ea792d80657f5da3e9e2bde60be91fc2016335d02c2a0153f

现在,试着在PyTorch中以超级简单的方式发现差异(在下面的代码中用粗体表示差异)。

6572f32e204b34dd03b861782061b208b6c28517

0999795514a6688a4d9f2321af2fbd18b0026179cd4ec39256bf2e3955691e358ea429b45e16cd31

与其它深度学习库比较

通过这个基准测试脚本中可以看出,PyTorch训练一个长短期记忆网络(LSTM)的过程比其他所有主要的深度学习库都要出色,因为它在每个时代的中位时间都最低(参考下图)。

bars_1x320LSTM_ce.png?raw=true

PyTorch中用于数据加载的API设计的非常好,它的接口可以在数据集、采样器和数据加载器中指定。并且通过与TensorFlow(读取器、队列等)数据加载工具比较发现,PyTorch的数据加载模块非常容易使用。此外,PyTorch在构建神经网络时是无缝的,所以不必依赖像Keras这样的第三方高层库。

另一方面,我也不建议使用PyTorch进行部署。因为它还尚未发展完美。正如PyTorch开发者说:“我们能够看到,用户会首先创建一个PyTorch模型,当要把模型投入生产时会将其转换为Caffe2模型,之后再运送到移动平台或其他平台。”

案例研究——解决PyTorch中的图像识别问题

为了更加熟悉PyTorch,我们将实践解决分析Vidhya的深度学习问题——识别数字。让我们看看我们的问题陈述:

我们的问题是图像识别问题,从一个给定的28x28图像中识别数字。一部分图像用于训练,其余的用于测试模型。

首先下载train和测试文件。该数据集包含所有图像的压缩文件,以及具有相应train和测试图像名称的train.csv和test.csv文件。数据集只提供png格式原始图像,不提供其它附加功能。

现在让我们开始吧:

步骤0:准备

a)导入所有必要的库。

1ebda80ed8eb8d64d62c2fad883db6e061068653

b)设置一个种子值,这样我们就可以控制模型的随机性。

3cf0174a2c1c41276f1bf59d60539ec2b25d8a25

c)安全起见,第一步设置目录路径。

5c3503282272a17b9108f761d6efb48bc8001ab7

步骤1:数据加载和预处理

A)现在让我们看看这些数据集。它们都有相应标签文件名,并且是.csv格式。

b3f01639e352b3e426989a68a339e4bbeaa33c6b

B)让我们看看数据是什么样的,现在读取图像并显示。

7a361478573dd041dd75e5fb603368d5ce618585

3.png

C)为了更容易操作,让我们把所以图像存储为numpy数组。

5fb58c1284c28f180dbb46a154e4ab3fd687217d

D)由于这是一个典型的机器语言(ML)问题,为了测试模型的正常运行,我们创建了一个验证集。训练集与验证集比例为70:30。

b1d8d3fba7cb1d15ad49035d75849315c5b6ac27

步骤2:构建模型

A)这是最重要的部分!首先定义神经网络架构。我们定义了一个具有输入、隐藏和输出三层的神经网络。输入和输出中的神经元数目是固定的,因为输入是28x28的图像,输出是一个10x1向量的代表类,而在隐藏层我们采用了50个神经元。在这里,我们用Adam作为优化算法,这是梯度下降算法的有效变体。

9cb557363cf5c2f0274d5ae6293c134f53c3dc37

B)训练模型。

389d2698aeace165c9af38052c9d9bc3d6f06009

d0d4ce7c67a6d2246c52a62e43ccdb6561ff3b25

ec1fa9bb68014715b63367750e81b9b0f16c21ec

ca97439ba082aba53d9f16a563104633aa36583a

训练成绩如下:

0.8779008746355685

而验证分数为:

0.867482993197279

这是一个相当令人印象深刻的分数,尤其是这个非常简单的神经网络我们只训练了5次。

希望这篇文章能让您看到PyTorch是如何改变构建深度学习模型的。在本文中,我们只是触及了表面。要想深入研究,您可以从PyTorch官网下载相关文档教程

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《An Introduction to PyTorch - A Simple yet Powerful Deep Learning Library》

作者:Faizan Shaikh

译者:奥特曼,审校:袁虎。

文章为简译,更为详细的内容,请查看原文

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
人工智能
使用钉钉扫一扫加入圈子
+ 订阅

了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目

其他文章