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中多种方式可以生成一个张量,下面用具体的代码介绍如何在深度学习中生成需要的张量,

    1. 使用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。这里需要注意的是,只有浮点型数据才能计算梯度,其他类型的数据是不能计算张量的梯度,例如下面的程序就会报错:

    2. 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张量
    3. 张量和NumPy数据相互转换

      PyTorch提供了Numpy数组和PyTorch张量相互转换的函数,非常方便对张量进行相关操作,如将张量转化为Numpy数组,在通过Numpy数组进行相关计算后,可以再次转化为张量,以便进行张量相关的计算。

      • 将Numpy数组转化为PyTorch张量,可以使用torch.as_tensor()函数和torch. from_numpy()函数,例如:

      从程序片段44和程序片段45的输出中得到的张量是64位浮点型数据,这是因为使用Numpy生成的数组默认就是64位浮点型数组

      • 针对PyTorch中的张量,使用torch.numpy()函数即可转化为Numpy数组。

    4. 随机数生成张量

      在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个数字重新随机排序后输出,使用如下程序:

    5. 其他生成张量的函数

      • 在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的空张量

posted @ 2020-12-23 15:55  豆子V  阅读(514)  评论(0编辑  收藏  举报