学习笔记,jupyter的笔记,文件可下载,格式.ipynb
希望对你有帮助
总结:以上面的张量s为例子。
s=torch.randint(0, 10, (3,4, 5), dtype=torch.float)#创建一个0-10范围的随机浮点型整数张量。gpt描述:torch随机生成形状为(3,4,5)的浮点型整数张量。
s的形状torch.Size([3, 4, 5])
s.sum()s.mean()的索引范围都是[-3,2],通过自定义函数srange获得索引范围[-3, -2, -1, 0, 1, 2],如超出该范围索引就会报错。
他们的索引号是这样排列 0, 1, 2
torch.Size([3, 4, 5])
-3,-2, -1
所以s.sum(-3)和s.sum(0)等效,-2和1等效,2和-1等效。
这里的索引0指向二维,也就是3,3代表有3个二维的矩阵,将这个3个二维矩阵相加就得到形状(4,5)矩阵。
第1个二维矩阵:
[[5., 6., 2., 3., 8.],
[1., 9., 5., 7., 2.],
[6., 7., 5., 5., 9.],
[4., 4., 4., 5., 1.]]。
第2个二维矩阵:
[[5., 6., 4., 7., 3.],
[7., 3., 7., 4., 1.],
[5., 2., 3., 2., 2.],
[5., 4., 3., 7., 7.]]。
第3个二维矩阵:
[[4., 8., 5., 8., 9.],
[6., 3., 5., 6., 1.],
[9., 7., 9., 5., 2.],
[6., 4., 7., 8., 6.]]。
3个二维矩阵相加:[[14., 20., 11., 18., 20.], #14/3,20/3,11/3,18/3得到就是s.mean(0)求平均,除以3,因为3个二维张量
[14., 15., 17., 17., 4.],
[20., 16., 17., 12., 13.],
[15., 12., 14., 20., 14.]]得到是二维矩阵。
索引1指向4,也就是1维向量,代表有一个二维张量有4个一维向量,将4个向量相加得到1个一维向量,但每个二维矩阵下面都有4个一维向量,也必须相加,
那么得到形状是[3,5]
第1个二维矩阵:[5., 6., 2., 3., 8.]+[1., 9., 5., 7., 2.]+[6., 7., 5., 5., 9.]+[4., 4., 4., 5., 1.]=[16., 26., 16., 20., 20.]
第2个二维矩阵:[5., 6., 4., 7., 3.]+[7., 3., 7., 4., 1.]+[5., 2., 3., 2., 2.]+[5., 4., 3., 7., 7.]=[22., 15., 17., 20., 13.]
第3个二维张量:[4., 8., 5., 8., 9.]+[6., 3., 5., 6., 1.]+[9., 7., 9., 5., 2.]+[6., 4., 7., 8., 6.]=[25., 22., 26., 27., 18.]
最后结果是一个二维张量:
[[16., 26., 16., 20., 20.],#16/4就是s.mean(1)求平均,除以4,因为4个1维张量
[22., 15., 17., 20., 13.],
[25., 22., 26., 27., 18.]]
索引2指向的是维度0,也就是标量。也就是torch.Size([3, 4, 5])里面的“5”,5各位标量直接相加。
[5., 6., 2., 3., 8.]=5+6+2+3+8=24,[1., 9., 5., 7., 2.]=24,[6., 7., 5., 5., 9.]=32,[4., 4., 4., 5., 1.]=18
[5., 6., 4., 7., 3.]=25,[7., 3., 7., 4., 1.]=22,[5., 2., 3., 2., 2.]=14,[5., 4., 3., 7., 7.]=26
[4., 8., 5., 8., 9.]=34,[6., 3., 5., 6., 1.]=21,[9., 7., 9., 5., 2.]=32, [6., 4., 7., 8., 6.]=34。
最后得到一个形状(3,4)的二维向量:
[[24., 24., 32., 18.], #24/5就是s.mean(2)求平均。因为5个标量,所以除以5.
[25., 22., 14., 26.],
[34., 21., 32., 31.]]
s.sum()和s.mean()用法一样,一个求和一个求平均。
s.unsqueeze()的索引范围是[-4,3],通过自定义函数qrange获得索引范围[-4,-3, -2, -1, 0, 1, 2, 3],如超出该范围索引就会报错。
他们的索引号是这样排列 0, 1, 2, 3
torch.Size([3, 4, 5]) H
-4,-3,-2, -1
显然s.unsqueeze(0)和s.unsqueeze(-4)等效,1和-3等效,2和-2等效,3和-1等效。其中3和-1最特殊,他是在张量最后维度加上一个维度。
用的比较频繁的是unsqueeze(-1),也可以这样用s.unsqueeze(-1).unsqueeze(-1)。
s.unsqueeze(0)形状变为torch.Size([1, 3, 4, 5]),在原张量0索引插入,其他维度向后挤压,3的前面插入
s.unsqueeze(1)形状变为torch.Size([3, 1, 4, 5])。4的前面插入
s.unsqueeze(2)形状变为torch.Size([3, 4, 1, 5])。5的前面插入
s.unsqueeze(-1)形状变为torch.Size([3, 4, 5, 1])。在最后一个维度插入,其实可以理解为在H处插入。H可以理解为隐含维度。
unsqueeze()其实可以理解为在张量外面套中括号[]
s.unsqueeze(0)在1个三维张量外面套了一个[],中括号增加1
s.unsqueeze(1)在3个二维张量位面套了一个[],中括号增加3
s.unsqueeze(2)在12个一维张量外面套了一个[],中括号增加12
s.unsqueeze(3)在60标量外面套了一个[],中括号增加60。