张量索引以及sum函数mean函数unsqueeze函数

本文详细解释了如何在PyTorch的Jupyter环境中使用torch.randint生成张量,并介绍了sum(),mean(),和unsqueeze()函数在处理张量形状、索引和维度扩展方面的应用,包括不同索引的等效性以及unsqueeze()函数在增加隐含维度时的作用。
摘要由CSDN通过智能技术生成

学习笔记,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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值