Einops переставляет функцию базовая функциональность

#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)
 

и т.д., Чтобы вы могли отслеживать движение каждого элемента в матрице