view(), reshape()
둘 다 tensor의 shape를 변경시키는데 사용된다.
view()는 tensor 모양 변화 시 새로운 텐서를 생성하는 것이 아니라 저장된 tensor memory는 그대로 두고 모양만 바꾼다. → 원래 텐서와 변화된 텐서의 메모리는 공유됨
그래서 view()사용을 위해서는 .contiguous()로 텐서의 메모리를 연속적으로 만들어 사용해야 한다.
reshape()의 경우 공식문서에 가능하면 input의 view를 반환하고, 그렇지 않으면 copy를 반환한다고 쓰여있는데, input이 contiguous하고 compatible strides를 가지면 view를 반환한다고 한다.
그래서 원본 input과 동일하게 저장해야한다면 clone()으로 copy하거나 view()를 사용해야 한다.
⇒ 기존 텐서를 변경하느냐 안하느냐의 차이
x = torch.randn((1, 2, 3))
y = x.contiguous().view(1, -1) # (1, 6)
y = x.reshape(1, -1) # (1, 6)
Python
복사
transpose(), permute()
이 함수들도 텐서의 shape를 변형시키는데 사용이 되는데, permute(), transpose()는 view와 마찬가지로 새로운 텐서를 생성하는 것이 아닌 저장된 텐서 메모리는 그대로 두고 모양만 바꾼다.
그러나 transpose와 permute는 non-contiguous input에도 작동이 가능하다. view()와 달리 반환되는 텐서는 contiguous하지 않다. contiguous하기를 원한다면 x.transpose().contiguous()를 적용시켜주어야한다.