了解重塑张量时的顺序

tom*_*m c 1 python numpy reshape pytorch 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]]
    ]
])
Run Code Online (Sandbox Code Playgroud)

首先想将其分成 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])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

对于上面的结果,我认为直接重塑 x.reshape([2, 3, 4]) 会起作用,它会产生正确的尺寸但结果不正确。

一般来说我是:

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

谢谢

Sha*_*hai 6

python、pytorch、numpy、c++ 等中内存中元素的顺序是行优先顺序:

[ first, second
  third, forth  ]
Run Code Online (Sandbox Code Playgroud)

而在 matlab、fortran 等中,顺序是列主

[ first,  third
  second, fourth ]
Run Code Online (Sandbox Code Playgroud)

对于更高维度的张量,这意味着元素从最后一个维度到第一个维度排序。

您可以使用torch.arange以下命令轻松地将其可视化.view

[ first, second
  third, forth  ]
Run Code Online (Sandbox Code Playgroud)

结果与

tensor([[[ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11]],

   [[12, 13, 14, 15],
    [16, 17, 18, 19],
    [20, 21, 22, 23]]])
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,元素首先按行(最后一个维度)排序,然后按列排序,最后按第一个维度排序。

当您reshape使用张量时,您不会更改元素的基本顺序,而只会更改shape张量的顺序。然而,如果你是permute一个张量 - 你会改变元素的基本顺序。

看看a.view(3,2,4)和之间的区别a.permute(0,1,2)-shape生成的两个张量是相同的,但元素的顺序不同:

[ first,  third
  second, fourth ]
Run Code Online (Sandbox Code Playgroud)