PyTorch学习笔记

Posted by Jack on 2020-05-01
Words 1.9k and Reading Time 8 Minutes
Viewed Times

1. PyTorch简介

PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。它主要由Facebook的人工智能研究团队开发,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这一点是现在很多主流框架如TensorFlow都不支持的。 PyTorch提供了两个高级功能:具有强大的GPU加速的张量计算(如Numpy)包含自动求导系统的深度神经网络

TensorFlow和Caffe都是命令式的编程语言,而且是静态的,首先必须构建一个神经网络,然后一次又一次使用相同的结构,如果想要改变网络的结构,就必须从头开始。但是对于PyTorch,通过反向求导技术,可以让你零延迟地任意改变神经网络的行为,而且其实现速度快。正是这一灵活性是PyTorch对比TensorFlow的最大优势。另外,PyTorch的代码对比TensorFlow而言,更加简洁直观,底层代码也更容易看懂,这对于使用它的人来说理解底层肯定是一件令人激动的事。

2. PyTorch环境搭建

2.1 PyTorch下载

PyTorch作为深度学习的一种框架,同样具有CPU版本和GPU版本,但是相信学习深度学习的同志们,应该没有人会选择CPU版本安装,所以此处着重介绍GPU版本的安装。GPU版本需要CUDA环境的支持,所以在此之前需要安装CUDA,如果是Windows系统具体的安装步骤可以参考这篇博客,其他的系统请自行Google下安装教程。
确保CUDA安装成功后,就是安装PyTorch了。其安装方式主要有两种,一是通过Anaconda的conda来安装,另一种是通过Python自带的pip来安装。在PyTorch主页提供了在线安装的方式,如下图所示:

通常,在线安装的过程会比较缓慢,加上有的人希望保留软件安装包,所以这里推荐大家下载离线安装包进行本地安装,如下图所示,大家可以根据自己系统的版本、Python的版本、CUDA的版本等进行下载。

2.2 PyTorch安装

离线安装包下载完后,Windows系统以管理员权限运行命令提示符,Mac系统和Linux系统打开Terminal,进入到离线安装包的下载目录,若使用conda安装PyTorch执行conda install torch-1.4.0+cu92-cp36-cp36m-win_amd64.whl命令,使用pip安装PyTorch则执行pip install torch-1.4.0+cu92-cp36-cp36m-win_amd64.whl命令。注意上面命令中的安装包名字更换为自己下载的版本

PyTorch的正常使用还需要安装torchvision,可以在上面提到的离线安装包页面下载自己对应的版本进行本地安装,这个找起来比较麻烦,加上这个库本来也不大,所以推荐在线安装torchvision。若使用conda执行conda install torchvision命令,使用pip则执行pip install torchvision命令。安装成功后,我们进入到Python Shell,然后输入以下内容:

1
2
3
4
>>> import torch
>>> torch.cuda.is_available()
True
>>>

如果没有提示出现error,并输出了True这个结果,说明PyTorch GPU版本安装成功。

3. PyTorch的基本使用

3.1 PyTorch入门

Tensors (张量)是PyTorch进行计算的基本单位,类似于NumPy的ndarrays,同时Tensors可以使用GPU进行计算。在使用之前,首先需要导入torch

1
>>> import torch

构造一个3x3矩阵,不进行初始化,结果如下:
1
2
3
4
>>> torch.empty(3, 3)
tensor([[2.9388e-39, 1.0194e-38, 1.0286e-38],
[1.0469e-38, 1.0653e-38, 1.0194e-38],
[8.4490e-39, 1.0469e-38, 8.4490e-39]])

构造一个3x3矩阵,随机初始化,结果如下:
1
2
3
4
>>> torch.rand(3, 3)
tensor([[0.7669, 0.4335, 0.8209],
[0.6676, 0.4976, 0.8942],
[0.4125, 0.4721, 0.3137]])

构造一个3x3的零矩阵,指定数据类型为long,结果如下:
1
2
3
4
>>> torch.zeros(3, 3)
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])

通过list数据构造一个张量,可指定数据类型:
1
2
3
4
>>> torch.tensor([1, 2, 3, 4.5])
tensor([1.0000, 2.0000, 3.0000, 4.5000])
>>> torch.tensor([1, 2, 3, 4.5], dtype=torch.long)
tensor([1, 2, 3, 4])

基于已经存在的tensor,创建一个新的tensor:
1
2
3
4
5
6
7
8
9
10
11
>>> a = torch.ones(3, 3, dtype=torch.float)
>>> a
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
# override dtype, with random value
>>> b = torch.randn_like(a, dtype=torch.double)
>>> b
tensor([[-1.4705, 0.7775, 1.3329],
[ 1.2939, 0.7027, -2.1825],
[ 0.3640, -0.2469, 0.7011]], dtype=torch.float64)

获取tensor的维度信息,注意torch.Size是一个元组,所以它支持左右的元组操作:
1
2
3
4
>>> b.size()
torch.Size([3, 3])
>>> b.size()[0]
3

改变tensor的大小或者形状,使用torch.view,比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> c = b.view(9)
>>> c
tensor([-1.4705, 0.7775, 1.3329, 1.2939, 0.7027, -2.1825, 0.3640, -0.2469,
0.7011], dtype=torch.float64)
>>> c.size()
torch.Size([9])
# the size -1 is inferred from other dimensions
>>> d = b.view(-1, 9)
>>> d
tensor([[-1.4705, 0.7775, 1.3329, 1.2939, 0.7027, -2.1825, 0.3640, -0.2469,
0.7011]], dtype=torch.float64)
>>> d.size()
torch.Size([1, 9])

3.2 PyTorch的简单运算

首先来看一下简单的加法运算,可直接使用 + 运算符,也可以使用 torch.add() 方法。同样,减法运算也可以使用 - 或者 torch.sub() 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
>>> x = torch.rand(2, 3)
>>> x
tensor([[0.1128, 0.5533, 0.3248],
[0.5724, 0.6773, 0.5933]])
>>> y = torch.rand(2, 3)
>>> y
tensor([[0.9269, 0.4395, 0.6245],
[0.6548, 0.8544, 0.6972]])
# 加法运算
>>> x + y
tensor([[1.0397, 0.9929, 0.9493],
[1.2272, 1.5316, 1.2905]])
>>> x.add(y)
tensor([[1.0397, 0.9929, 0.9493],
[1.2272, 1.5316, 1.2905]])
>>> torch.add(x, y)
tensor([[1.0397, 0.9929, 0.9493],
[1.2272, 1.5316, 1.2905]])
# 减法运算
>>> x - y
tensor([[-0.8141, 0.1138, -0.2996],
[-0.0825, -0.1771, -0.1038]])
>>> x.sub(y)
tensor([[-0.8141, 0.1138, -0.2996],
[-0.0825, -0.1771, -0.1038]])
>>> torch.sub(x, y)
tensor([[-0.8141, 0.1138, -0.2996],
[-0.0825, -0.1771, -0.1038]])

绝对值计算使用 torch.abs() 方法,三角函数使用 torch.sin()torch.cos()torch.tan() 等方法,求和计算使用 torch.sum() 方法,平均值计算使用 torch.mean() 方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> z = x - y
>>> z
tensor([[-0.8141, 0.1138, -0.2996],
[-0.0825, -0.1771, -0.1038]])
>>> torch.abs(z)
tensor([[0.8141, 0.1138, 0.2996],
[0.0825, 0.1771, 0.1038]])
>>> torch.sin(z)
tensor([[-0.7271, 0.1136, -0.2952],
[-0.0824, -0.1762, -0.1037]])
>>> torch.sum(z)
tensor(-1.3633)
>>> torch.mean(z)
tensor(-0.2272)

3.2 PyTorch的矩阵运算

矩阵的点乘运算,即对应位置的元素相乘,使用 torch.mul() 方法。

1
2
3
>>> torch.mul(x, y)
tensor([[0.1046, 0.2432, 0.2029],
[0.3748, 0.5786, 0.4137]])

矩阵的叉乘运算,我们常叫做矩阵乘法,要求第一个矩阵的列数等于第二个矩阵的行数,使用 torch.mm() 方法。
1
2
3
4
>>> torch.mul(x.t(), y)
tensor([[0.4794, 0.5386, 0.4695],
[0.9564, 0.8218, 0.8177],
[0.6896, 0.6497, 0.6165]])

一维矩阵的运算,即向量运算,使用 torch.dot() 方法。
1
2
3
4
5
6
7
8
>>> x1 = x.view(-1)
>>> x1
tensor([0.1128, 0.5533, 0.3248, 0.5724, 0.6773, 0.5933])
>>> y1 = y.view(-1)
>>> y1
tensor([0.9269, 0.4395, 0.6245, 0.6548, 0.8544, 0.6972])
>>> torch.dot(x1, y1)
tensor(1.9177)


...

...

00:00
00:00