#torch #einops
Вопрос:
Я пытаюсь использовать синтаксис 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)
Любая помощь будет признательна
Ответ №1:
rearrange(mat, '(h n) w -> (n h) w', n = 2)
and
rearrange(mat, '(n h) w -> (h n) w', n = 2)
являются инверсиями друг друга. Если вы можете представить, что делает один, второй выполняет обратное преобразование
Что касается последнего, коврик имеет размер 8х4
rearrange(mat, '(n h) w -> (h n) w', n = 4)
Поэтому вы сначала разделяете первое измерение на 4×2 (ниже я игнорирую измерение w, потому что с ним ничего особенного не происходит).
[0, 1, 2, 3, 4, 5, 6, 7]
Для
[0, 1,
2, 3,
4, 5,
6, 7]
затем вы меняете порядок осей на 2×4 (транспонирование)
[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)
и т.д., Чтобы вы могли отслеживать движение каждого элемента в матрице