理解重塑张量时的顺序

2022-04-18 00:00:00 python numpy pytorch reshape tensor

问题描述

对于张量:

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])会起作用,它产生了正确的尺寸,但结果不正确。

总的来说,我是:

  1. 不确定如何将张量拆分为x.Shape[0]张量。
  2. 对重塑的工作原理感到困惑。大多数时候我都能把尺寸弄对,但数字的顺序总是错的。

谢谢


解决方案

据我所知,你有一个形状为(B,C,H,W)的张量,你想把它转换成(B,H,C*W)。为此,您需要执行以下两个步骤

  1. x的维度重新排列为(B,H,C,W),以具有名为y的新张量
  2. y重塑为(B,H,C*W)以获得最终结果

x重塑为(B,H,C,W)而不是(B,H,W,C)的原因是

  • 您希望由具有相同行索引的x(即您通过1234指示的3x2矩阵)的子矩阵行连接而成的结果中有一行。
  • Pytorch的reshape函数以行为主的方式运行。

因此,需要将行放在彼此的顶部,以便重塑才能返回所需的顺序。

按照上述推理,获取what_i_want的代码为

what_i_want = x.permute(0, 2, 1, 3).reshape(2, 3, 4)

相关文章