PyTorch快速入门
PyTorch快速入门
1. 安装
linux系统
-
安装Anaconda环境
从官网下载Linux版本的anaconda,https://www.anaconda.com/download/
-
在终端执行
bash Anaconda2-5.0.0.1-Linux-x86_64.sh
-
安装过程中会显示配置路径
Prefix=/home/moluo/anaconda2/
-
在终端输入$sudo gedit /etc/profile,打开profile文件,在末尾添加一行:
export PATH=/home/moluo/anaconda2/bin:$PATH
,其中,将/home/moluo/anaconda2/bin
替换为你实际的安装路径,保存。 -
输入
source /etc/profile
-
打开终端,输入python,显示anaconda,则表示安装成功。
-
访问PyTorch的官网地址:https://pytorch.org/,根据自己的系统选定PyTorch的版本,命令行输入
conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch
-
至此安装结束
2.张量
2.0 张量
-
在数学中,一个单独的数可以称为标量, 一列或者一 -行数组可以称为向量, 个二维数组称为矩阵,矩阵中的每一个元素都可以被行和列的索引唯一确定, 如果数组的维度超过2. 那么我们可以称该数组为张量(Tensor)。但是在PyTorch中, 与张量属于一种数据结构,它可以是一个标量、一个向量、一个矩阵,甚至是更高维度的数组,所以PyTorch中Tensor和NumPy库中的数组( ( ndaray )非常相似,在使用时也会经常将PyTrh中的张量和INumPy中的数组相互转化。在深度网络中,基于例PyTorch的相关计算和优化都是在Tensor的基础上完成的。
-
在PyTorch的0.4版本之前,Tensor是不能计算梯度的,所以在深度学习网络中,需要计算梯度的Tensor都需要使用Variable ( Tensor )将张量进行封装,这样才能构建计算图。但是在PyTorch的0.4版本之日后,合并了Tensor和Variable类,可直接计算Tensor的梯度,不再需要田Variable封装Tensor,因此Variable(的使用逐渐从API中消失。
2.1张量的数据类型
在torch中CPU和GPU张量分别有8种数据类型,如表所示:
数据类型 | dtype | CPU tensor | GPU tensor |
---|---|---|---|
32位浮点型 | torch.float32或torch.float | torch.FloatTensor | torch.cuda.FloatTensor |
64位浮点型 | torch.float64或torch.double | torch.DoubleTensor | torch.cuda.DoubleTensor |
16位浮点型 | torch.float16或torch.half | torch.HalfTensor | torch.cuda.HalfTensor |
8位无符号整型 | torch.uint8 | torch.ByteTensor | torch.cuda. ByteTensor |
8位有符号整型 | torch.int8 | torch.CharTensor | torch.cuda.CharTensor |
16位有符号整型 | torch.int16或torch.short | trch.ShortTensor | torch.cuda.ShortTensor |
32位有符号整型 | trch.int32或torch.int | torch.IntTensor | torch.cuda.IntTeTensor |
64位有符号整型 | trch.int64或torch.long | torch.LongTensor | torch.cuda.LongTeTensor |
在Torch中默认的数据类型是32位浮点型(torch.float32),可以通过torch.set_default_tensor_type()
函数设置默认的数据类型,下面使用程序展示如何查看和设置张量的数据类型
- 在程序中使用torch.tensor()函数生成一个张量,然后使用dtype方法来获取张量的数据类型,结果为32位浮点类型
- 从张量的.dtype方法输出结果为torch.float64可知,通过
torch.set_default_tensor_type(torch.DoubleTensor)
已经将默认的数据类型设置为64位浮点型,在torch中还有其他的数据类型,将浮点型转换为其他的数据类型的方法如下:
- 由于在In [5]中已经将张量默认的数据类型设置为64位浮点型,所以生成的张量a的数据类型为torch.float64,针对张量a,使用a.long()方法可以将其转换为64位浮点型,使用a.int()可将其转化为32位有符号整形,a.float()将其转化为32位浮点型,
- 如果想要恢复32位浮点型,需再次使用
torch.set_default_tensor_type()
函数,程序如下:
- 从张量的.dtype方法输出结果为torch.float32可知,通过
torch.set_default_tensor_type(torch.FloatTensor)
已经将默认的数据类型恢复,为32位浮点型,也可以使用torch.get_default_dtype()函数,获取默认的数据类型,如:
2.2 张量的生成
-
在PyTorch中多种方式可以生成一个张量,下面用具体的代码介绍如何在深度学习中生成需要的张量,
-
使用torch.tensor()函数生成张量
Python的列表或序列可以通过torch.tensor()函数构造张量
上面程序中使用torch.tensor()函数将Python列表转化为张量,张量的维度可以通过.shape()查看.并可以通过.size()方法计算张量形状的大小,使用.numel()方法计算张量中元素包含的数量
在使用torch.tensor()函数时,可以使用函数dtype来指定张量的数据类型,使用参数
requires_grad
来指定张量是否需要计算梯度.只有计算了梯度的张量,才能在深度网络优化时根据梯度的大小进行跟新.下面生成一个需要计算梯度的张量B;使用参数requires_grad = True表明张量B可以计算每个元素的梯度,下面针对张量B计算sum(B2)在每个元素上的梯度大小:
从输出结果可以看出每个位置上的梯度为 2 x B。这里需要注意的是,只有浮点型数据才能计算梯度,其他类型的数据是不能计算张量的梯度,例如下面的程序就会报错:
-
torch.Tensor()函数
- 在PyTorch中也可使用torch.Tensor()函数来生成张量,而且可以根据指定的形状生成张量。例如,根据Python列表生成张量C。
- 也可以根据形状参数生成特定尺寸的张量。例如:生成2x3的张量D。
- 针对已经生成的张量可以使用
torch.**_like()
系列函数生成与指定张量维度相同、性质相似的张量,如使用torch.ones_ like()
函数生成 与D维度相同的全1张量。
- 使用torch.zeros_ like()函数生成与D维度相同的全0张量:
- 使用torch.rand__like()函数生成与D维度相同的随机张量:
- 针对一个创建好的张量D,可以使用
D.new_**()
系列函数创建出的张量,如 使用D.new_tensor()
将列表转化为张量:
上面的程序使用
D.new.tensor(E)
将列表E转化为32位浮点型的张量。还可以使 用其他函数得到新的张量,如表所示。函数 描述 D.new_ full((3,3), fill_value= 1) 3x3使用1填充的张量 D.new_ zeros((3,3)) 3x3的全0张量 D.new_ empty((3,3)) 3x3的空张量 D.new_ ones((3,3)) 3x3的全1张量 -
张量和NumPy数据相互转换
PyTorch提供了Numpy数组和PyTorch张量相互转换的函数,非常方便对张量进行相关操作,如将张量转化为Numpy数组,在通过Numpy数组进行相关计算后,可以再次转化为张量,以便进行张量相关的计算。
- 将Numpy数组转化为PyTorch张量,可以使用torch.as_tensor()函数和torch. from_numpy()函数,例如:
从程序片段44和程序片段45的输出中得到的张量是64位浮点型数据,这是因为使用Numpy生成的数组默认就是64位浮点型数组。
- 针对PyTorch中的张量,使用torch.numpy()函数即可转化为Numpy数组。
-
随机数生成张量
在PyTorch中还可以通过相关随机数来生成张量,并且可以指定生成随机数的分布函数等。在生成随机数之前,可以使用torch.manual_seed()函数, 指定生成随机数的种子,用于保证生成的随机数是可重复出现的。如使用torch.normal()生成服 从正态( 0, 1 )分布的随机数:
- 在torch.normal()函数中,通过mean参数指定随机数的均值,std参 数指定随机数的标准差,如果mean参数和std参数都只有一个元素则只会生成一个随机数; 如果mean参数和std参数有多个值,则可生成 多个随机数,例如:
上面的例子中,每个随机数服从的分布均值都是0,但是它们分布的标准差则分别为1、2、3、4。当然也可以分别指定每个随机数服从的均值,例如:
上面的例子中,每个随机数服从的分布均值分别为1、2、3、4,分布的标准差分别为1、2、3、4.
- 也可以使用torch.rand()函数,在区间[0,1]上生成服从均匀分布的张量:
- 而torch.rand_like函数,则可根据其他张量维度,生成与其维度相同的随机数张量,例如:
- 使用torch.randn()和torch.rand_like()函数则可生成服从标准正态分布的随机数张量,例如:
- 使用torch. randperm(n)函数,则可将0~ n( (包含0不包含n )之间的整数进行随机排序后输出,例如:将 0 ~ 9 这10个数字重新随机排序后输出,使用如下程序:
-
其他生成张量的函数
- 在pytorch中包含np.arange()用法相同的函数torch.arange(),常常用来生成张量,例如;
在torch.arange()中,参数start指定开始, 参数end指定结束,参数step则指定步长。
- 可使用torch.linspace()函数在范围内生成固定数量的等间隔张量,例如:
- torch.logspace()函数则可生成以对数为间隔的张量,例如:
输出的结果和
10**(torch.linspace(start = 0.1, end = 1, steps=1)
等价。同时PyTorch 中还包含很多预定义的函数,用于生成特定的张量。常用的函数如表所示。函数 描述 torch.zeros(3,3) 3x3的全0张量 torch.ones(3,3) 3x3的全1张量 torch.eye(3) 3x3的单位张量 torch.full((3).fill_value = 0.25) 3x3使用0.25填充的张量 torch.empty(3,3) 3x3的空张量
-