本文中所有代码的前提是调用PyTorch包
import torch
1. 张量的理解
标量:0维张量;向量:1维张量;矩阵:2维张量。扩展至高维数据,统称为张量。
2. PyTorch的张量创建
2.1 列表类型转变为张量类型
torch.tensor([1,2,3,4])
2.2 PyTorch包内置方法创建
torch.rand(l,m,n) # [l,m,n]维的向量,内部元素在[0,1]区间分布
torch.randn(l,m,n) # [l,m,n]维的向量,内部元素在[0,1]区间服从标准正态分布
torch.zeros(l,m,n) # [l,m,n]维的向量,内部元素全是0
torch.ones(l,m,n) # [l,m,n]维的向量,内部元素全是1
torch.eye(n) # [n,n]维的单位矩阵
2.3 通过已有张量来创建新的张量
已知t为一个张量,那么
torch.zeros_like(t) # 生成一个形状和t张量相同,但内部元素全是0的新张量
torch.ones_like(t) # 生成一个形状和t张量相同,但内部元素全是1的新张量
torch.rand_like(t) # 生成一个形状和t张量相同,但内部元素在[0,1]区间分布的新张量
torch.randn_like(t) # 生成一个形状和t张量相同,但内部元素在[0,1]区间标准正态分布的新张量
3. 张量的常用操作
3.1 查看张量的维度
t.shape # 返回张量t的维度[l,m,n]
t.size() # 返回张量t的维度[l,m,n]
3.2 索引与切片—— 与列表类似
正向索引从0开始,逆向索引从-1开始;
t[i,j,k] # 截取第(i,j,k)的元素
t[i][j][k] # 截取第(i,j,k)的元素
3.3 张量的运算
3.3.1 张量中的加法
a + b # 张量中对应位置的元素相加
torch.add(a,b) # 张量中对应位置的元素相加
3.3.2 张量中的减法
a - b # 张量中对应位置的元素相减
torch.sub(a,b) # 张量中对应位置的元素相减
3.3.3 张量中的乘法
a * b # 对应位置的元素相乘
orch.mul(a,b) # 对应位置的元素相乘
a @ b # 矩阵乘法
torch.mm(a,b) # 矩阵乘法
torch.matmul(a,b) # 矩阵乘法
3.3.3 张量中的除法
a / b # 对应位置的元素相除
torch.div(a,b) # 矩阵除法
3.4 张量的变换
已知t是一个[l,m,n]维的张量,那么
3.4.1 张量的维度互换
t.transpose(index1,index2) # 将[l,m,n]索引index1和index2的维度互换
t.t() # 矩阵的转置(只适用2位矩阵张量)
>>> import torch
>>> t = torch.randn(1,2,3)
>>> t.transpose(0,2).shape
torch.Size([3, 2, 1])
>>> t = torch.randn(1,2)
>>> t.transpose(0,1).shape
torch.Size([2, 1])
>>> t.t().shape
torch.Size([2, 1])
3.4.2 张量的拼接
torch.cat([a,b],dim=index) #将a,b两个张量按[l,m,n]中索引index维度来拼接在一起
>>> a = torch.zeros([2,3])
>>> b = torch.ones([2,3])
>>> torch.cat([a,b],dim=0)
tensor([[0., 0., 0.],
[0., 0., 0.],
[1., 1., 1.],
[1., 1., 1.]])
>>> torch.cat([a,b],dim=1)
tensor([[0., 0., 0., 1., 1., 1.],
[0., 0., 0., 1., 1., 1.]])
3.4.3 张量的维度变换
t.view(l*m,n) # 将3维[l,m,n]转换为2维[l*m,n]
t.reshape(l*m,n) # 将3维[l,m,n]转换为2维[l*m,n]
>>> t = torch.randn(2,3,4)
>>> t
tensor([[[ 1.0335, 1.0147, -1.3945, 1.6790],
[-3.3516, 0.2724, -0.2280, -0.6264],
[ 1.2656, -0.2339, 0.1558, -1.0012]],
[[ 0.9168, -0.6912, -0.7835, 1.2702],
[ 0.0952, 0.1173, -0.2743, -0.4733],
[ 0.6820, -1.2333, -0.5377, -1.6138]]])
>>> t.view(6,4)
tensor([[ 1.0335, 1.0147, -1.3945, 1.6790],
[-3.3516, 0.2724, -0.2280, -0.6264],
[ 1.2656, -0.2339, 0.1558, -1.0012],
[ 0.9168, -0.6912, -0.7835, 1.2702],
[ 0.0952, 0.1173, -0.2743, -0.4733],
[ 0.6820, -1.2333, -0.5377, -1.6138]])
>>> t.reshape(6,4)
tensor([[ 1.0335, 1.0147, -1.3945, 1.6790],
[-3.3516, 0.2724, -0.2280, -0.6264],
[ 1.2656, -0.2339, 0.1558, -1.0012],
[ 0.9168, -0.6912, -0.7835, 1.2702],
[ 0.0952, 0.1173, -0.2743, -0.4733],
[ 0.6820, -1.2333, -0.5377, -1.6138]])
3.4.4 张量维度的增加
t.unsqueeze(index) # 在列表[l,m,n]索引index的位置增加维度
>>> t = torch.randn(1,2,3)
>>> t0 = t.unsqueeze(0)
>>> t1 = t.unsqueeze(1)
>>> t2 = t.unsqueeze(2)
>>> t.shape
torch.Size([1, 2, 3])
>>> t0.shape
torch.Size([1, 1, 2, 3])
>>> t1.shape
torch.Size([1, 1, 2, 3])
>>> t2.shape
torch.Size([1, 2, 1, 3])
注:index看成索引,也可以存在逆向索引。
3.4.5 张量维度的删除
t.squeeze(index) # 在列表[l,m,n]索引index的维度,但该维度的size必须为1.
>>> t = torch.randn(1,2,3)
>>> t0 = t.squeeze(0)
>>> t1 = t.squeeze(1)
>>> t2 = t.squeeze(2)
>>> t.shape
torch.Size([1, 2, 3])
>>> t0.shape
torch.Size([2, 3])
>>> t1.shape
torch.Size([1, 2, 3])
>>> t2.shape
torch.Size([1, 2, 3])
3.4.6 张量维度的扩展
t.expand(i,j,k) # 对[l,m,n]中size=1的维度变换对应的[i,j,k]
若i,j,k为-1,表示该维度的size不变。
>>> t = torch.randn(1,2,3,1)
>>> t.expand(2,-1,-1,3).shape
torch.Size([2, 2, 3, 3])
3.4.7 张量的分割
t.split(i, dim=index) # 将张量按照i的指定长度在index维进行拆分
t.chunk(i, dim=index) # 将张量在index维进行拆分成i个张量
>>> t = torch.randn(4,2)
>>> t1,t2 = t.split(2,dim=0)
>>> t1
tensor([[-0.0380, -0.8659],
[ 0.0554, -0.9546]])
>>> t2
tensor([[-0.0887, -0.5898],
[-0.0952, -0.5161]])
>>> t3,t4 = t.chunk(2,dim=0)
>>> t3
tensor([[-0.0380, -0.8659],
[ 0.0554, -0.9546]])
>>> t4
tensor([[-0.0887, -0.5898],
[-0.0952, -0.5161]])