下面介绍sequeeze和 unsqueeze API
squeeze为维度挤压
unsqueeze为维度展开
用法:
API: a.unsqueeze(dim)
print(a.unsqueeze(0).shape)
# 在原[4, 1, 28, 28]的第0个维度上插入一个维度torch.Size([1, 4, 1, 28, 28])同理也可以进行其他类型转换
print(a.unsqueeze(-1).shape)
# 在原[4, 1, 28, 28]的第后面那个维度上插入一个维度
print(a.unsqueeze(-2).shape)
# 在原[4, 1, 28, 28]的第倒数第2个维度上插入一个维度torch.Size([4, 1, 28, 28, 1])
torch.Size([4, 1, 28, 1, 28])使用时也要注意设定的维度是否具有合理性,如正着数是0~4,倒着数是-1~-5。
print(a.unsqueeze(-5).shape)
# 在原[4, 1, 28, 28]的第后面那个维度上插入一个维度
print(a.unsqueeze(5).shape)
# 在原[4, 1, 28, 28]的第倒数第2个维度上插入一个维度输出结果为
torch.Size([1, 4, 1, 28, 28])物理意义上来说可以理解为在batch前面加了一个组
第一个可以正常输出,后面那个因维度不存在,程序报错
Traceback (most recent call last):
File "E:/公众号/维度变换/1.1.py", line 24, in <module>
print(a.unsqueeze(5).shape)
IndexError: Dimension out of range (expected to be in range of [-5, 4], but got 5)这里可以总结为括号内的index的范围为[-a.dim()-1, a.dim()+1)。注意是包含前面不包含后面(括号类型)。
先将插入的idx和插入位置总结为下图

另外
为更深入了解,我们先构建一个tensor
b = torch.tensor([1.1, 2.2])
print(b)
print(b.shape)
c = b.unsqueeze(-1)
print(c)
print(c.shape)
d = b.unsqueeze(0)
print(d)
print(d.shape)分别输出为
tensor([1.1000, 2.2000])
torch.Size([2])
tensor([[1.1000],
[2.2000]])
torch.Size([2, 1])
tensor([[1.1000, 2.2000]])
torch.Size([1, 2])由此可见确定好插入维度的位置,对于进行维度变换十分重要
下面以具体例子介绍维度变换操作
# 先构建一个32的通道
b = torch.rand(32)
# 再设定一个转换的最终目标
f = torch.rand(4, 32, 14, 14)
# 思考如何通过维度变换将b转化为f
# 本节考虑先将[32]变为[1, 32, 1, 1],后续通过维度扩张的讲解再进行后续步骤
b = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)
# 进行了[32]=>[32, 1]=>[32, 1, 1]=>[1, 32, 1, 1]
print(b.shape)输出为
torch.Size([1, 32, 1, 1])这种维度增加方式在以后的图片处理中十分常见,要求务必掌握。
本文分享自 python pytorch AI机器学习实践 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!