深度学习自然语言处理实战
上QQ阅读APP看书,第一时间看更新

2.2 PyTorch入门

PyTorch是一个基于Python语言的科学计算包,是脸书(Facebook)公司在2017年1月基于Torch推出的。它主要提供了两个高级功能:强大的GPU加速的张量(Tensor)计算以及包含自动求导系统的深度学习神经网络。它使用Python编写了很多底层的内容,使用非常灵活,支持动态图机制,是非常简洁、高效的深度学习框架,并让用户把精力最大限度地投入到如何实现自己的想法上。

2.2.1 Tensor基本概念

在使用PyTorch之前,可以先对环境中配置的PyTorch进行校验,以查看所使用的版本。

本书使用的PyTorch版本为1.4.0。

在PyTorch中,Tensor用于表示矩阵(多维数据),类似于NumPy中的ndarrays,可以使用GP U来加速运算。

那么,Tensor在PyTorch中该怎么表示呢?可以直接通过torch来构造一个5×3的矩阵。

输出的结果为

构造一个随机初始化的5×3矩阵。

输出的结果为

构造一个全都是0的5×3的矩阵,矩阵中每个值的数据类型都是长整型(long)。

输出的结果为

使用已有的数据来构造一个新的Tensor。

输出的结果为

基于已经存在的Tensor构造新的Tensor。

输出的结果为

对于两个Tensor,使用size()分别获取Tensor的维度信息。

输出的结果为

构建Tensor的方法还有很多,官方提供了如下的应用程序接口(Application Programming Interface,API)来进行构建。

对于已经创建的Tensor,如果只有一个元素,可以使用item()函数来获得这个Tensor的值(value)。

输出结果为

2.2.2 Tensor的运算

上述操作介绍的都是如何生成Tensor,那么,这些新生成的Tensor可以用来做什么呢?

Tensor的加法。

输出的结果为

Tensor的另一种加法方式是add方式。

输出的结果为

Tensor还可以使用inplace进行加法运算。

输出结果为

可以看到,三种加法运算的结果是一致的,在使用的过程中,可以选择其中一种。

使用索引来访问Tensor的第一行数据。

输出的结果为

通过view()函数改变Tensor的形状。

输出的结果为

view()函数返回的新的Tensor与源Tensor共享内存,即指向的Tensor是同一个。view()函数仅改变对Tensor的观察角度。

输出的结果为

以上展示的都是两个维度相同的Tensor做运算,当两个Tensor的维度不同时,我们可以使用广播(Broadcasting)机制进行计算。

广播机制是NumP y中对于不同维度的数组进行数值计算的方法,对数组的运算通常是在对应的每个元素上进行的。这种机制在Tensor的运算上也同样适用,当运算的两个数组的维度不同时,Tensor将自动触发广播机制。广播机制的规则如下:

1)所有的数组都看齐维度最长的数组,维度不足的部分在前加1补足对齐。

2)运算后的数组的维度是所输入的所有数组在各个维度上的最大值。

3)如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为1时,这个数组能够用来计算,否则会出错。

4)当输入数组的某个维度的长度为 1时,沿着此维度运算时都将用此维度上的第一组值。

输出结果为

由于x是个1×3的矩阵,y是个4×1的矩阵,如果需要计算x + y,那么x中的第一行的元素被广播到了第二行到第四行,而y中第一列的元素则被广播到了第二列和第三列。这样操作之后,可以将这两个新的矩阵按照元素相加。

在上面的例子中可以看到,很多NumPy的函数在Tensor上可以继续使用,可以使用numpy()和form_numpy()函数对Tensor和NumPy中的数组进行转换。

使用numpy()函数将数组由Tensor转化为NumPy。

输出的结果为

对矩阵x的元素进行加1,看一下x与y会发生什么。

输出的结果为

对矩阵y的元素进行加1,看一下x与y会发生什么。

输出的结果为

从上述结果可以看到经过numpy()函数所产生的新的数组与源数组共享相同的内存,即改变其中一个也会改变另一个。

使用from_numpy()函数将数组由NumPy转化为Tensor。

输出的结果为

对矩阵x的元素进行加1,看一下x与y会发生什么。

输出的结果为

对矩阵y的元素进行加1,看一下x与y会发生什么。

输出的结果为

从上述结果可以看到经过from_numpy()函数所产生的新的数组跟源数组共享相同的内存,即改变其中一个也会改变另一个。

使用to()函数可以让Tensor在不同的CPU或GPU设备上使用。

输出的结果为