理解重塑张量时的顺序

本教程将介绍理解重塑张量时的顺序的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

理解重塑张量时的顺序 教程 第1张

问题描述

对于张量:

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(即您通过1234指示的3x2矩阵)的子矩阵行连接而成的结果中有一行。

    Pytorch的reshape函数以行为主的方式运行。

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

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

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

好了关于理解重塑张量时的顺序的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。