PyTorch入门教程

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

介绍

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

PyTorch入门教程_第1张图片

在本文中,我们将讲解如何入门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入门教程_第2张图片

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

PyTorch入门教程_第3张图片

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

·PyTorch张量

·数学运算

·Autograd模块

·Optim模块

·神经网络模块

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

PyTorch张量

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

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

PyTorch入门教程_第4张图片

数学运算

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

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

PyTorch入门教程_第5张图片

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

PyTorch入门教程_第6张图片

Autograd模块

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

PyTorch入门教程_第7张图片


PyTorch入门教程_第8张图片

Optim模块

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

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

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

神经网络模块

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

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

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

PyTorch入门教程_第9张图片

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

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

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

PyTorch入门教程_第10张图片
PyTorch入门教程_第11张图片
PyTorch入门教程_第12张图片

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

PyTorch入门教程_第13张图片


PyTorch入门教程_第14张图片
PyTorch入门教程_第15张图片

与其它深度学习库比较

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

PyTorch入门教程_第16张图片

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

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

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

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

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

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

现在让我们开始吧:

步骤0:准备

a)导入所有必要的库。

PyTorch入门教程_第17张图片

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

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

PyTorch入门教程_第18张图片

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

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

PyTorch入门教程_第19张图片

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

PyTorch入门教程_第20张图片

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

PyTorch入门教程_第21张图片

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

PyTorch入门教程_第22张图片

步骤2:构建模型

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

PyTorch入门教程_第23张图片

B)训练模型。

PyTorch入门教程_第24张图片
PyTorch入门教程_第25张图片
PyTorch入门教程_第26张图片
PyTorch入门教程_第27张图片

训练成绩如下:

0.8779008746355685

而验证分数为:

0.867482993197279

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

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

本文由阿里云云栖社区组织翻译。

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

作者:Faizan Shaikh

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

你可能感兴趣的