一、张量的基本概念
张量(Tensor),就是多维数组。当维度小于或等于2时,张量又有一些更熟悉的名字:
- 矩阵: 2维张量又被称为【矩阵】(Matrix);
- 向量: 1维张量又被称为【向量】(Vector);
- 标量: 0维张量又被称为【标量】(Scalar),其实就是一个数值。
- torch.rand(2,3):创建一个形状为(2,3)的随机张量,每个值从[0,1)之间的均匀分布中抽取;
- torch.randn(2,3):创建一个形状为(2,3)的随机张量,每个值从标准正态分布(均值0,方差1)中抽取;
二、张量的聚合操作
聚合操作(Aggregation):常见的张量聚合运算包括:求平均、求和、最大值、最小值等。
张量的聚合运算关于dim的规则:
在做张量的运算操作时,dim设定了哪个维,就会遍历这个维去做运算(也称“沿着该维运算”),其他为顺序不变。
- 当dim= n n n(n>2) 时,则结果的 n + 1 n+1 n+1 维发生变化,其余维度不变。
- 当dim= 1 1 1 时,则结果变为两个向量的运算,维度变形。为了使结果保持正确的维度,聚合操作提供了
keepdim参数
,默认设置为False,需要显示地设为True
。
示例代码:
import torch
x = torch.tensor([[1,2,3],[4,5,6]],dtype=torch.float32) # 不指定dtype=torch.float32,计算x.mean(dim=0)将会报错RuntimeError: mean(): input dtype should be either floating point or complex dtypes.Got Long instead
x.mean(dim=0)
>>>
tensor([2.5000, 3.5000, 4.5000])
x.mean(dim=1)
>>>
tensor([2., 5.])
# 设置参数keepdim是结果保持正确的维度
x.mean(dim=0,keepdim=True)
>>>
tensor([[2.5000, 3.5000, 4.5000]])
x.mean(dim=1,keepdim=True)
>>>
tensor([[2.],
[5.]])
三、张量的拼接操作
张量的拼接操作
(torch.cat
)也是类似的,通过指定维度dim,获得不同的拼接结果。
张量的拼接运算关于dim的规则:
在做张量的运算操作时,dim设定了哪个维,就会遍历这个维去做运算(也称“沿着该维运算”),其他为顺序不变。
- 当dim= n n n 时,则结果的 n + 1 n+1 n+1 维发生变化,其余维度不变。 (备注:dim的 n n n 从0开始计数,结果的 n + 1 n+1 n+1 维从1开始计数。)
x = torch.tensor([[1,2,3],[4,5,6]],dtype=torch.float32)
y = torch.tensor([[7,8,9],[10,11,12]],dtype=torch.float32)
torch.cat((x,y),dim=0)
>>>
tensor([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.],
[10., 11., 12.]])
torch.cat((x,y), dim=1)
>>>
tensor([[ 1., 2., 3., 7., 8., 9.],
[ 4., 5., 6., 10., 11., 12.]])
张量的升维、降维
有时为了适配某些运算,需要对一个张量进行升维或降维。具体而言:
升维: 就是通过torch.unsqueeze(input, dim, out=None)函数,对输入张量的dim位置插入维度1,并返回一个新的张量。与索引相同,dim的值也可以为负数。
降维: 就是通过torch.squeeze(input, dim=None, out=None)函数。
- 在不指定dim时,张量中形状为1的所有维都将被除去。如:输入形状为(A,1,B,1,C,1,D)的张量,那么输出形状就为(A,B,C,D)。
- 在指定dim时,降维操作只在给定维度上。如:输入形状为(A,1,B),squeeze(input,dim=0)函数将会保持张量不变,只有用squeeze(input,dim=1)函数时,形状才会变成(A,B)。