1

我正在尝试理解用于张量重新排序的 einops 语法,但不知何故错过了重点

如果我有以下矩阵:

mat = torch.randint(1, 10, (8,4))

我了解以下命令的作用:

rearrange(mat, '(h n) w -> (n h) w', n = 2)

但我无法真正理解以下内容:

rearrange(mat, '(n h) w -> (h n) w', n = 2)
rearrange(mat, '(n h) w -> (h n) w', n = 4)

任何帮助,将不胜感激

4

1 回答 1

2
rearrange(mat, '(h n) w -> (n h) w', n = 2)
and
rearrange(mat, '(n h) w -> (h n) w', n = 2)

是彼此的倒置。如果你能想象一个做什么,第二个做反向变换

至于后者,mat是8x4

rearrange(mat, '(n h) w -> (h n) w', n = 4)

所以你首先将第一个维度拆分为 4x2 (下面我忽略 w 维度,因为它没有什么特别的事情发生)

[0, 1, 2, 3, 4, 5, 6, 7]

[0, 1, 
 2, 3, 
 4, 5, 
 6, 7]

然后将轴的顺序更改为 2x4(转置)

[0, 2, 4, 6,
 1, 3, 5, 7]

然后将两个维度合并为一个

[0, 2, 4, 5, 1, 3, 5, 7]

如果您仍然不觉得它是如何工作的,请举一些更简单的例子,例如

rearrange(np.arange(50), '(h n) -> h n', h=5)
rearrange(np.arange(50), '(h n) -> h n', h=10)
rearrange(np.arange(50), '(h n) -> n h', h=10)

等等,这样您就可以跟踪矩阵中每个元素的移动

于 2021-08-07T18:40:51.133 回答