原文标题:
An Introduction to PyTorch – A Simple yet Powerful Deep LearningLibrary
作者:FAIZAN SHAIKH
翻译:和中华
本文约3600字,建议阅读15分钟。
本文通过案例带你一步步上手PyTorch。
介绍
每隔一段时间,就会有一个有潜力改变深度学习格局的python库诞生,PyTorch就是其中一员。
在过去的几周里,我一直沉浸在PyTorch中,我被它的易用性所吸引。在我使用过的各种深度学习库中,到目前为止PyTorch是最灵活最易用的。
在本文中,我们将以一种更实用的方式探索PyTorch, 其中包含了基础知识和案例研究。同时我们还将对比分别用numpy和PyTorch从头构建的神经网络,以查看它们在具体实现中的相似之处。
让我们开始吧!
注意:本文假定你对深度学习有基本的认知。如果想快速了解,请先阅读此文https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-networks/
目录
PyTorch概览
深入技术
构建神经网络之Numpy VS. PyTorch
与其他深度学习库对比
案例研究 --- 用PyTorch解决图像识别问题
PyTorch概览
PyTorch的创作者说他们遵从指令式(imperative)的编程哲学。这就意味着我们可以立即运行计算。这一点正好符合Python的编程方法学,因为我们没必要等到代码全部写完才知道它是否能运行。我们可以轻松地运行一部分代码并实时检查它。对于我这样的神经网络调试人员而言,这真是一件幸事。
PyTorch是一个基于python的库,它旨在提供一个灵活的深度学习开发平台。
PyTorch的工作流程尽可能接近Python的科学计算库--- numpy。
你可能会问,我们为什么要用PyTorch来构建深度学习模型呢?我列举三点来回答这个问题:
易用的API:像Python一样简单易用;
支持Python:如上所说,PyTorch平滑地与Python数据科学栈集成。它与Numpy如此相似,你甚至都不会注意到其中的差异;
动态计算图:PyTorch没有提供具有特定功能的预定义图,而是提供给我们一个框架用于构建计算图,我们甚至可以在运行时更改它们。这对于一些情况是很有用的,比如我们在创建一个神经网络时事先并不清楚需要多少内存。
使用PyTorch还有其他一些好处,比如它支持多GPU,自定义数据加载器和简化的预处理器。
自从2016年1月初发布以来,许多研究人员已经将它纳入自己的工具箱,因为它易于构建新颖甚至非常复杂的图。话虽如此,PyTorch要想被大多数数据科学从业者所接受还需时日,因为它既是新生事物而且还在”建设中”。
深入技术
在深入细节之前,我们先了解一下PyTorch的工作流程。
PyTorch使用了指令式编程范式。也就是说,用于构建图所需的每行代码都定义了该图的一个组件。即使在图被完全构建好之前,我们也可以在这些组件上独立地执行计算。这被称为 ”define-by-run” 方法。
Source: http://pytorch.org/about/
安装PyTorch非常简单。你可以根据你的系统,按照官方文档中提到的步骤操作。例如,下面是基于我的选项所用的命令:
conda install pytorch torchvision cuda91 -cpytorch
在我们开始使用PyTorch时,应该了解的主要元素是:
PyTorch张量(Tensors)
数学运算
Autograd模块
Optim模块
nn模块
下面,我们将详细介绍每一部分。
1. PyTorch张量
张量就是多维数组。PyTorch中的张量与Numpy中的ndarrays很相似,除此之外,PyTorch中的张量还可以在GPU上使用。PyTorch支持各种类型的张量。
你可以定义一个简单的一维矩阵如下:
# import pytorch
import torch
# define a tensor
torch.FloatTensor([2])
2
[torch.FloatTensor of size 1]
2. 数学运算
与numpy一样,科学计算库有效地实现数学函数是非常重要的。PyTorch提供了一个类似的接口,你可以使用超过200多种数学运算。
以下是一个简单的加法操作例子:
a = torch.FloatTensor([2])
b = torch.FloatTensor([3])
a + b
5
[torch.FloatTensor of size 1]
这难道不像是一个典型的python方法吗?我们也可以在定义过的PyTorch张量上执行各种矩阵运算。例如,我们转置一个二维矩阵:
matrix = torch.randn(3, 3)
matrix
-1.3531 -0.5394 0.8934
1.7457 -0.6291 -0.0484
-1.3502 -0.6439 -1.5652
[torch.FloatTensor of size 3x3]
matrix.t()