我试图理解用于张量重新排序的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)
任何帮助都将不胜感激
发布于 2021-08-07 18:40:51
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)
等,这样您就可以跟踪矩阵中每个元素的移动
https://stackoverflow.com/questions/68685636
复制相似问题