第二章(4)Pytorch安装和张量创建

1. Pytorch基础
PyTorch是一个基于Python的科学计算库,也是目前深度学习领域中最流行的深度学习框架之一。PyTorch的核心理念是张量计算,即将数据表示为张量,在计算时使用自动微分机制优化模型。在使用PyTorch进行深度学习时,了解张量的基础操作、类型、大小等知识是非常重要的。
本文将介绍如何在PyTorch的安装、创建张量、了解张量的类型与大小、进行张量操作、索引、切片和连接、以及使用CUDA张量进行计算加速。
1.1 Pytorch安装
PyTorch支持Windows、Linux和MacOS等操作系统。
1.1.1 Linux和Windows
在Linux和Windows中,可以通过pip命令安装PyTorch和对应的torchvision和torchaudio包。如下所示:
pip install torch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0
需要注意的是,这里的命令只能安装CPU版本的PyTorch。如果需要安装GPU版本的PyTorch,需要前往官网寻找对应版本的CUDA或ROCm支持。
1.1.2 ROCm和CUDA
在使用ROCm或CUDA时,需要单独指定版本号。以CUDA 10.2为例,可以使用以下命令来安装GPU版本的PyTorch:
pip install torch==1.10.0+cu102 torchvision==0.11.0+cu102 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html
需要注意的是,+cu102表示使用CUDA 10.2,而+f对应的URL是从PyTorch官方网站下载PyTorch库和对应版本的依赖项。
更多安装命令,请参考:Previous PyTorch Versions | PyTorch
1.2 创建张量
1.2.1 直接创建
直接创建是最基本的创建张量的方法,我们可以使用torch.tensor()
函数来直接创建一个张量。该函数会根据输入的数据类型自动推断所创建的张量的数据类型,大小和形状等属性。例如,我们可以用以下代码创建一个大小为(2, 3)
的浮点型张量:
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32)
print(x)
实验结果:
tensor([[1., 2., 3.],
[4., 5., 6.]])
上述代码创建了一个大小为(2, 3)
的张量,并赋值给变量x
。张量的内容是由列表表示的,也就是[[1,2,3],[4,5,6]]
。张量中的元素类型为浮点型,这是由可选参数dtype
指定的,若不指定,则为默认的参数类型。
除了torch.tensor()
函数,我们还可以使用torch.from_numpy()
函数来创建张量。这个函数会把一个NumPy数组转换为PyTorch中的张量。这里需要注意的是,该函数创建的张量和原始NumPy数组共享底层的存储空间,也就是说,如果我们修改了张量中的某个元素,原始的NumPy数组也会受到影响。以下代码是一个例子:
import numpy as np
import torch
x = np.array([[1, 2, 3], [4, 5, 6]]) #定义的numpy类型
y = torch.from_numpy(x)
print(y)
y[0][2] = -1
print(x)
实验结果:
tensor([[1, 2, 3],
[4, 5, 6]])
[[ 1 2 -1]
[ 4 5 6]]
上述代码中,我们创建了一个NumPy
数组x
,接着使用torch.from_numpy()
函数将其转换为张量y
。然后我们修改了张量y
中的第一个元素的第三个分量,并且打印了原始的NumPy
数组x
。可以看到,由于y
和x
共享底层的存储空间,所以在修改了y
之后,x
也被修改了。
1.2.2 通过数值创建
除了直接创建以外,我们还可以使用一些预定义的函数来生成特定的张量,例如全零张量,全一张量,以及随机张量等。
(1)全零张量和全一张量
使用torch.zeros()
函数和torch.ones()
函数可以分别创建全零张量和全一张量。示例代码如下:
import torch
x = torch.zeros((2, 3), dtype=torch.float32)
y = torch.ones((2, 3), dtype=torch.float32)
print(x)
print(y)
实验结果:
tensor([[0., 0., 0.],
[0., 0., 0.]])
tensor([[1., 1., 1.],
[1., 1., 1.]])
上述代码中分别使用torch.zeros((2, 3))
函数和torch.ones((2, 3))
函数创建了维度相同的两个张量。同时,也指定了所创建张量的元素类型为浮点型dtype=torch.float32
。
tips:在实际应用中,全零张量和全一张量经常用于初始化神经网络中的权重和偏置等参数。
(2)依据指定值创建
创建相同数值的指定值张量,采用的函数为torch.full()
,示例如下:
import torch
x = torch.full((2, 3), 8)
print(x)
实验结果:
tensor([[8., 8., 8.],
[8., 8., 8.]])
我们使用torch.full((2, 3), 8)
函数创建了一个大小为(2, 3)
的张量,并将其中的所有元素设置为7
。
(3)随机张量
对于深度学习中的模型来说,随机张量是非常重要的。在PyTorch中,我们可以使用torch.randn()
和torch.rand()
等函数来生成正态分布和均匀分布的随机张量。示例如下:
import torch
x = torch.randn((2, 3))
y = torch.rand((3, 4))
print(x)
print(y)
实验结果:
tensor([[-1.2964, 0.8592, -0.5766],
[ 0.9974, -0.7744, -0.6711]])
tensor([[0.6243, 0.9297, 0.7626, 0.4891],
[0.4266, 0.7566, 0.3390, 0.5008],
[0.5415, 0.9943, 0.0577, 0.4002]])
上述代码中,我们使用了torch.randn((2, 3))
和torch.rand((3, 4))
函数来分别创建大小为(2, 3)
和(3, 4)
的张量。其中,torch.randn()
函数生成元素值服从标准正态分布的张量,而torch.rand()
函数生成元素值在区间[0,1)
之间均匀分布的张量。
(4)等差序列的创建
torch.arange()
函数和torch.linspace()
函数可以创建等差序列。其中,torch.arange()
函数的步长是自定义的,而torch.linspace()
函数则是在给定的范围内均匀地分布元素。示例如下:
import torch
x = torch.arange(0, 10, 2)
y = torch.linspace(0, 1, 5)
print(x)
print(y)
实验结果:
tensor([0, 2, 4, 6, 8])
tensor([0.0000, 0.2500, 0.5000, 0.7500, 1.0000])
在上述代码中,我们通过调用torch.arange(0, 10, 2)
函数来创建步长为2
,范围在[0,10)
内的等差序列。同时,我们还使用了torch.linspace(0, 1, 5)
函数来生成在区间[0, 1]
内五个等距的数值。
(5) 单位矩阵的创建
torch.eye(n)
可以创建大小为(n, n)
的单位矩阵,该矩阵的对角线上的元素都是1。示例如下:
import torch
x = torch.eye(3)
print(x)
实验结果:
tensor([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
在上述代码中,我们创建了大小为(3, 3)
的单位矩阵,并赋值给变量x
。
1.2.3 利用已有的张量创建新的张量
在PyTorch中,我们还可以利用已有的张量创建新的张量。下面介绍一下常用的这类函数。
(1) torch.zeros_like()
和torch.ones_like()
函数
torch.zeros_like()
和torch.ones_like()
函数是用处创建与某个张量大小相同的全0或者1的张量,示例如下:
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = torch.zeros_like(x)
z = torch.ones_like(x)
print(x)
print(y)
print(z)
实验结果:
tensor([[1, 2, 3],
[4, 5, 6]])
tensor([[0, 0, 0],
[0, 0, 0]])
tensor([[1, 1, 1],
[1, 1, 1]])
在上述代码中,我们首先创建一个大小为(2, 3)
的张量x
,然后使用torch.zeros_like(x)
和torch.ones_like(x)
函数分别创建了与x
大小相同的全0张量y
和全1张量z
。
(2) torch.cat()
函数
torch.cat()
函数可以沿着指定的维度将多个张量拼接成一个新的张量。例如,我们可以将两个大小相同的张量按行(维度0)拼接起来。示例代码如下:
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = torch.tensor([[7, 8, 9], [10, 11, 12]])
z = torch.cat([x, y], dim=0)
p = torch.cat([x, y], dim=1)
print(x)
print(y)
print(z)
print(p)
实验结果:
tensor([[1, 2, 3],
[4, 5, 6]])
tensor([[ 7, 8, 9],
[10, 11, 12]])
tensor([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
tensor([[ 1, 2, 3, 7, 8, 9],
[ 4, 5, 6, 10, 11, 12]])
这段代码创建了两个包含有相同维度的张量 x
和 y
,分别表示 2 行 3 列的矩阵。然后,使用 torch.cat()
函数将两个张量按照指定的维度进行拼接,生成了一个新的张量 z
和 p
。其中 dim=0
表示按照第一维(行)进行拼接,而 dim=1
表示按照第二维(列)进行拼接。最后,打印了四个张量的值。可以看到,x
和 y
没有变化,而 z
和 p
分别包含了 x
和 y
的所有元素。其中 z
为拼接后的形状为 4 行 3 列的矩阵,而 p
为拼接后的形状为 2 行 6 列的矩阵。