理解重塑张量时的顺序
问题描述
对于张量:
x = torch.tensor([
[
[[0.4495, 0.2356],
[0.4069, 0.2361],
[0.4224, 0.2362]],
[[0.4357, 0.6762],
[0.4370, 0.6779],
[0.4406, 0.6663]]
],
[
[[0.5796, 0.4047],
[0.5655, 0.4080],
[0.5431, 0.4035]],
[[0.5338, 0.6255],
[0.5335, 0.6266],
[0.5204, 0.6396]]
]
])
首先要将其拆分为2(x.Shape[0])张量,然后将它们合并。在这里,只要我得到正确的输出,我就不需要真正地拆分它,但在视觉上,拆分它然后再将它们合并在一起对我来说更有意义。
例如:
# the shape of the splits are always the same
split1 = torch.tensor([
[[0.4495, 0.2356],
[0.4069, 0.2361],
[0.4224, 0.2362]],
[[0.4357, 0.6762],
[0.4370, 0.6779],
[0.4406, 0.6663]]
])
split2 = torch.tensor([
[[0.5796, 0.4047],
[0.5655, 0.4080],
[0.5431, 0.4035]],
[[0.5338, 0.6255],
[0.5335, 0.6266],
[0.5204, 0.6396]]
])
split1 = torch.cat((split1[0], split1[1]), dim=1)
split2 = torch.cat((split2[0], split2[1]), dim=1)
what_i_want = torch.cat((split1, split2), dim=0).reshape(x.shape[0], split1.shape[0], split1.shape[1])
对于上面的结果,我认为直接重塑x.rehape([2,3,4])会起作用,它产生了正确的尺寸,但结果不正确。
总的来说,我是:
- 不确定如何将张量拆分为x.Shape[0]张量。
- 对重塑的工作原理感到困惑。大多数时候我都能把尺寸弄对,但数字的顺序总是错的。
谢谢
解决方案
据我所知,你有一个形状为(B,C,H,W)的张量,你想把它转换成(B,H,C*W)。为此,您需要执行以下两个步骤
- 将
x
的维度重新排列为(B,H,C,W),以具有名为y
的新张量 - 将
y
重塑为(B,H,C*W)以获得最终结果
将x
重塑为(B,H,C,W)而不是(B,H,W,C)的原因是
- 您希望由具有相同行索引的
x
(即您通过1
、2
、3
、4
指示的3x2矩阵)的子矩阵行连接而成的结果中有一行。 - Pytorch的
reshape
函数以行为主的方式运行。
因此,需要将行放在彼此的顶部,以便重塑才能返回所需的顺序。
按照上述推理,获取what_i_want
的代码为
what_i_want = x.permute(0, 2, 1, 3).reshape(2, 3, 4)
相关文章