在 pytorch 中重塑张量?

Reshape tensors in pytorch?

我正在为 pytorch 中矩阵乘法的结果苦苦挣扎,我不知道如何解决它,特别是: 我将这两个矩阵相乘

tensor([[[[209.5000, 222.7500],
          [276.5000, 289.7500]],

         [[208.5000, 221.7500],
          [275.5000, 288.7500]]]], dtype=torch.float64)

tensor([[[[ 0.,  1.,  2.,  5.,  6.,  7., 10., 11., 12.],
          [ 2.,  3.,  4.,  7.,  8.,  9., 12., 13., 14.],
          [10., 11., 12., 15., 16., 17., 20., 21., 22.],
          [12., 13., 14., 17., 18., 19., 22., 23., 24.]],

         [[25., 26., 27., 30., 31., 32., 35., 36., 37.],
          [27., 28., 29., 32., 33., 34., 37., 38., 39.],
          [35., 36., 37., 40., 41., 42., 45., 46., 47.],
          [37., 38., 39., 42., 43., 44., 47., 48., 49.]],

         [[50., 51., 52., 55., 56., 57., 60., 61., 62.],
          [52., 53., 54., 57., 58., 59., 62., 63., 64.],
          [60., 61., 62., 65., 66., 67., 70., 71., 72.],
          [62., 63., 64., 67., 68., 69., 72., 73., 74.]]]],
       dtype=torch.float64)

使用以下代码行 A.view(2,-1) @ B,然后我使用 result.view(2, 3, 3, 3) 重塑结果。 结果矩阵是

tensor([[[[ 6687.5000,  7686.0000,  8684.5000],
          [11680.0000, 12678.5000, 13677.0000],
          [16672.5000, 17671.0000, 18669.5000]],

         [[ 6663.5000,  7658.0000,  8652.5000],
          [11636.0000, 12630.5000, 13625.0000],
          [16608.5000, 17603.0000, 18597.5000]],

         [[31650.0000, 32648.5000, 33647.0000],
          [36642.5000, 37641.0000, 38639.5000],
          [41635.0000, 42633.5000, 43632.0000]]],


        [[[31526.0000, 32520.5000, 33515.0000],
          [36498.5000, 37493.0000, 38487.5000],
          [41471.0000, 42465.5000, 43460.0000]],

         [[56612.5000, 57611.0000, 58609.5000],
          [61605.0000, 62603.5000, 63602.0000],
          [66597.5000, 67596.0000, 68594.5000]],

         [[56388.5000, 57383.0000, 58377.5000],
          [61361.0000, 62355.5000, 63350.0000],
          [66333.5000, 67328.0000, 68322.5000]]]], dtype=torch.float64)

相反我想要

tensor([[[[ 6687.5000,  7686.0000,  8684.5000],
          [11680.0000, 12678.5000, 13677.0000],
          [16672.5000, 17671.0000, 18669.5000]],

         [[31650.0000, 32648.5000, 33647.0000],
          [36642.5000, 37641.0000, 38639.5000],
          [41635.0000, 42633.5000, 43632.0000]],

         [[56612.5000, 57611.0000, 58609.5000],
          [61605.0000, 62603.5000, 63602.0000],
          [66597.5000, 67596.0000, 68594.5000]]],


        [[[ 6663.5000,  7658.0000,  8652.5000],
          [11636.0000, 12630.5000, 13625.0000],
          [16608.5000, 17603.0000, 18597.5000]],

         [[31526.0000, 32520.5000, 33515.0000],
          [36498.5000, 37493.0000, 38487.5000],
          [41471.0000, 42465.5000, 43460.0000]],

         [[56388.5000, 57383.0000, 58377.5000],
          [61361.0000, 62355.5000, 63350.0000],
          [66333.5000, 67328.0000, 68322.5000]]]], dtype=torch.float64)

有人可以帮助我吗?谢谢

这是一个常见但有趣的问题,因为它涉及 torch.reshapes and torch.transpose 的组合来解决它。更具体地说,您需要

  1. 应用初始重塑来重构张量并公开要交换的轴;
  2. 然后使用转置操作这样做;
  3. 最后应用第二次整形以获得所需的格式。

对于你的情况,你可以这样做:

>>> result.reshape(3,2,3,3).transpose(0,1).reshape(2,3,3,3)
tensor([[[[ 6687.5000,  7686.0000,  8684.5000],
          [11680.0000, 12678.5000, 13677.0000],
          [16672.5000, 17671.0000, 18669.5000]],

         [[31650.0000, 32648.5000, 33647.0000],
          [36642.5000, 37641.0000, 38639.5000],
          [41635.0000, 42633.5000, 43632.0000]],

         [[56612.5000, 57611.0000, 58609.5000],
          [61605.0000, 62603.5000, 63602.0000],
          [66597.5000, 67596.0000, 68594.5000]]],


        [[[ 6663.5000,  7658.0000,  8652.5000],
          [11636.0000, 12630.5000, 13625.0000],
          [16608.5000, 17603.0000, 18597.5000]],

         [[31526.0000, 32520.5000, 33515.0000],
          [36498.5000, 37493.0000, 38487.5000],
          [41471.0000, 42465.5000, 43460.0000]],

         [[56388.5000, 57383.0000, 58377.5000],
          [61361.0000, 62355.5000, 63350.0000],
          [66333.5000, 67328.0000, 68322.5000]]]], dtype=torch.float64)

我鼓励您查看中间结果以了解该方法的工作原理,以便您将来可以将其应用于其他用例。