Это - очень хороший ответ, который объясняет тему в контексте NumPy. PyTorch работает по сути одинаково. В его документах обычно не упоминается, являются ли выходные данные функций (не) смежными, но об этом можно догадаться, основываясь на типе операции (с некоторым опытом и пониманием реализации). Как правило, большинство операций сохраняют смежность, поскольку они создают новых тензоров. Вы можете увидеть несмежные выходные данные, если операция работает с массивом на месте и меняет его шаг. Несколько примеров ниже
import torch
t = torch.randn(10, 10)
def check(ten):
print(ten.is_contiguous())
check(t) # True
# flip sets the stride to negative, but element j is still adjacent to
# element i, so it is contiguous
check(torch.flip(t, (0,))) # True
# if we take every 2nd element, adjacent elements in the resulting array
# are not adjacent in the input array
check(t[::2]) # False
# if we transpose, we lose contiguity, as in case of NumPy
check(t.transpose(0, 1)) # False
# if we transpose twice, we first lose and then regain contiguity
check(t.transpose(0, 1).transpose(0, 1)) # True
В общем, если у вас есть несмежный тензор t
, вы можете сделать его непрерывным, вызвав t = t.contiguous()
. Если t
является непрерывным, вызов t.contiguous()
по сути является запретом, так что вы можете сделать это, не рискуя большим ударом по производительности.