PyTorch入门教程
摘要: 本文将讲解如何入门PyTorch,包括基础原理知识、numpy与PyTorch的区别以及案例研究实例。
介绍
PyTorch是一个非常有可能改变深度学习领域前景的Python库。我尝试使用了几星期PyTorch,然后被它的易用性所震惊,在我使用过的各种深度学习库中,PyTorch是最灵活、最容易掌握的。
在本文中,我们将讲解如何入门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使用了命令式/热切的范例。也就是说,在构建一个图形时,每一行代码都定义了改图的一个组件。我们甚至能在图形构建完成前,独立的对这些组件进行计算。这就是所谓的“逐运行”方法。
安装PyTorch非常简单。您可以按照官方文档中提到的步骤操作,并根据您的系统规格运行命令。例如,这是我根据我选择的选项使用的命令:
在开始使用PyTorch时应该了解的主要元素:
·PyTorch张量
·数学运算
·Autograd模块
·Optim模块
·神经网络模块
下面让我们依次介绍这些元素吧。
PyTorch张量
张量只是多维数组。PyTorch中的张量类似于numpy的ndarrays,另外,张量也可以在GPU上使用。PyTorch支持各种类型的张量。
你可以如下定义一个简单的一维矩阵:
数学运算
与numpy一样,科学计算库非常重要的一点是能够实现高效的数学功能。而PyTorch提供了一个类似的借口,可以使用200个以上的数学运算。
下面是在PyTorch中实现一个简单的添加操作的例子:
这和基本的python方法非常相似。我们还可以在定义的PyTorch张量上执行各种矩阵运算。例如,我们要转置一个二维矩阵:
Autograd模块
PyTorch使用了一种叫做自动微分的技术。也就是说,它会有一个记录我们所有执行操作的记录器,之后再回放记录来计算我们的梯度。这一技术在构建神经网络时尤其有效,因为我们可以通过计算前路参数的微分来节省时间。
Optim模块
Torch.optim是一个实现各种优化算法的模块,用于构建神经网络。它支持大多数常用的方法,因此我们不必从头开始构建它们。
下面是使用Adam优化器的代码:
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
神经网络模块
虽然PyTorch Autograd可以很容易的定义计算图形和使用梯度,但是对于定义复杂的神经网络来说可能有点太低级了。而这就需要神经网络模块来提供帮助。
nn包定义了一组模块,我们可以把它看作是一个神经网络层,它产生输入输出,并且可能有一些可训练的权重。
你可以把nn模块看作是PyTorch的内核!
现在您已经了解了PyTorch的基本组件,那么可以轻松地从头构建自己的神经网络了。如果想知道怎么做,就继续往下看吧。
分别在Numpy和PyTorch中构建神经网络并比较
我之前提到过PyTorch和Numpy非常相似,现在让我们看看原因。在本节中,我们将通过实现一个简单的神经网络来解决二进制分类问题。
现在,试着在PyTorch中以超级简单的方式发现差异(在下面的代码中用粗体表示差异)。
与其它深度学习库比较
通过这个基准测试脚本中可以看出,PyTorch训练一个长短期记忆网络(LSTM)的过程比其他所有主要的深度学习库都要出色,因为它在每个时代的中位时间都最低(参考下图)。
PyTorch中用于数据加载的API设计的非常好,它的接口可以在数据集、采样器和数据加载器中指定。并且通过与TensorFlow(读取器、队列等)数据加载工具比较发现,PyTorch的数据加载模块非常容易使用。此外,PyTorch在构建神经网络时是无缝的,所以不必依赖像Keras这样的第三方高层库。
另一方面,我也不建议使用PyTorch进行部署。因为它还尚未发展完美。正如PyTorch开发者说:“我们能够看到,用户会首先创建一个PyTorch模型,当要把模型投入生产时会将其转换为Caffe2模型,之后再运送到移动平台或其他平台。”
案例研究——解决PyTorch中的图像识别问题
为了更加熟悉PyTorch,我们将实践解决分析Vidhya的深度学习问题——识别数字。让我们看看我们的问题陈述:
我们的问题是图像识别问题,从一个给定的28x28图像中识别数字。一部分图像用于训练,其余的用于测试模型。
首先下载train和测试文件。该数据集包含所有图像的压缩文件,以及具有相应train和测试图像名称的train.csv和test.csv文件。数据集只提供png格式原始图像,不提供其它附加功能。
现在让我们开始吧:
步骤0:准备
a)导入所有必要的库。
b)设置一个种子值,这样我们就可以控制模型的随机性。
c)安全起见,第一步设置目录路径。
步骤1:数据加载和预处理
A)现在让我们看看这些数据集。它们都有相应标签文件名,并且是.csv格式。
B)让我们看看数据是什么样的,现在读取图像并显示。
C)为了更容易操作,让我们把所以图像存储为numpy数组。
D)由于这是一个典型的机器语言(ML)问题,为了测试模型的正常运行,我们创建了一个验证集。训练集与验证集比例为70:30。
步骤2:构建模型
A)这是最重要的部分!首先定义神经网络架构。我们定义了一个具有输入、隐藏和输出三层的神经网络。输入和输出中的神经元数目是固定的,因为输入是28x28的图像,输出是一个10x1向量的代表类,而在隐藏层我们采用了50个神经元。在这里,我们用Adam作为优化算法,这是梯度下降算法的有效变体。
B)训练模型。
训练成绩如下:
0.8779008746355685
而验证分数为:
0.867482993197279
这是一个相当令人印象深刻的分数,尤其是这个非常简单的神经网络我们只训练了5次。
希望这篇文章能让您看到PyTorch是如何改变构建深度学习模型的。在本文中,我们只是触及了表面。要想深入研究,您可以从PyTorch官网下载相关文档和教程。
本文由阿里云云栖社区组织翻译。
文章原标题《An Introduction to PyTorch - A Simple yet Powerful Deep Learning Library》
作者:Faizan Shaikh
译者:奥特曼,审校:袁虎。