PyTorch是一个Python包,提供两个高级功能:
- 具有强大的GPU加速的张量计算(如NumPy)
- 包含自动求导系统的的深度神经网络
1.何为张量
矩阵可以进行各种运算
为了方便存储矩阵及进行矩阵之间的运算,大神们抽象出了PyTorch库,PyTorch库中有一个类叫torch.Tensor,这个类存储了一个矩阵变量,并且有一系列方法用于对这个矩阵进行各种运算。上面的这些矩阵运算都可以通过torch.Tensor类的相应方法实现。
import torch # 引入torch类
x = torch.rand(5, 3) # 生成一个5*3的矩阵x,矩阵的每个元素都是0到1之间的随机数,x的类型就是torch.Tensor,x里面存了一个5*3的矩阵
y = torch.zeros(5, 3, dtype=torch.long) # 生成一个5*3的矩阵y,矩阵的每个元素都是0,每个元素的类型是long型,y的类型就是torch.Tensor,y里面存了一个5*3的矩阵
y.add_(x) # 使用y的add_方法对y和x进行运算,运算结果保存到y
上面的x、y的类型都是torch.Tensor,Tensor这个单词一般可译作“张量”
为什么要给这个类型起名字叫张量呢,直接叫矩阵不就行了吗?张量又是什么意思呢?
通常我们不但要对矩阵进行运算,我们还会对数组进行运算(当然数组也是特殊的矩阵),比如两个数组的加法:
在机器学习中,我们更多的会对下面形状这样的数进行运算:
大家可以把这种数看作几个矩阵叠在一起,这种我们暂且给它取一个名字叫“空间矩阵”或者“三维矩阵”。
因此用“矩阵”不能表达所有我们想要进行运算的变量,所以,我们使用张量把矩阵的概念进行扩展。这样普通的矩阵就是二维张量,数组就是一维张量,上面这种空间矩阵就是三维张量,类似的,还有四维、五维、六维张量
对于一维张量[1,2,3],
在PyTorch中可以表达为torch.tensor([1,2,3])
对于二维张量
,
在PyTorch中可以表达为torch.tensor([[1,2,3],[4,5,6]])
聪明的读者可能发现了,多一个维度,我们就多加一个[]
所以对于上图中的“空间矩阵”,我们可以这样表达:
torch.tensor([[[9,1,8],[6,7,5],[3,4,2]],[[2,9,1],[8,6,7],[5,3,4]],[[1,5,9],[7,2,6],[4,8,3]]])
torch.tensor([
[[9,1,8],[6,7,5],[3,4,2]],
[[2,9,1],[8,6,7],[5,3,4]],
[[1,5,9],[7,2,6],[4,8,3]]
])
可以看到上面中间三行的每一行都是一个矩阵,所以我们就知道了,每多一个方向的数据,我们就多加一个[]
再重复一下形状的概念,这个概念也很重要,
对于矩阵
,它有两行三列,我们说它的形状是(2,3)
对于上面的那个空间矩阵,在x轴、y轴、z轴上它都是三个数,所以我们说它的形状是(3,3,3)
同理我们可以生成任意形状的张量:
x = torch.rand(2,3,4,5) #生成一个(2,3,4,5)形状的张量,注意与torch.rand([2,3,4,5])的区别
所以为什么叫张量而不是矩阵呢?就是因为我们通常需要处理的数据有零维的(单纯的一个数字)、一维的(数组)、二维的(矩阵)、三维的(空间矩阵)、还有很多维的。Pytorch为了把这些各种维统一起来,所以起名叫张量。
张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是二维张量。如果你之前用过NumPy,你会发现Tensor
和NumPy的多维数组非常类似。
也就是说,tensor和NumPy都是为了表达张量(多维数组),在这些张量(多维数组)上可以进行各种各样的运算,因此把张量及其运算封装成了类,张量的运算就是类里面的方法。
创建tensor:
x = torch.empty(5, 3)
x = torch.rand(5, 3)
x = torch.zeros(5, 3, dtype=torch.long)
x = torch.tensor([5.5, 3])
x = x.new_ones(5, 3, dtype=torch.float64)
y = torch.randn_like(x, dtype=torch.float)
获取Tensor
的形状:
print(x.size())
print(x.shape)
Tensor
的各种操作:
y = torch.rand(5, 3)
print(x + y) # 加法形式一
print(torch.add(x, y)) # 加法形式二
# adds x to y
y.add_(x) # 加法形式三
print(y)
PyTorch中的Tensor
支持超过一百种操作,包括转置、索引、切片、数学运算、线性代数、随机数等等,总之,凡是你能想到的操作,在pytorch里都有对应的方法去完成。