데이터가 보이는 모양을 바꾸는 연산
이 연산들은 가능하면 바이트를 옮기지 않고 스트라이드, 즉 PyTorch가 메모리를 따라가는 방법만 바꿔. 요청한 모양을 현재 메모리 배치로 표현할 수 없을 때만 복사가 일어나. 스트라이드를 이해하면 텐서가 왜 어떤 모양 변환에서는 복사되고 다른 변환에서는 복사되지 않는지 알 수 있어.
네 가지 연산
reshape(*shape): 가장 유연해. 메모리 배치가 허용하면 뷰를 반환하고 그렇지 않으면 복사하므로 언제나 동작해.view(*shape): 복사 없이 뷰만 반환해. 텐서가 연속적이지 않으면 오류가 나.transpose(d0, d1)/.T: 두 차원의 순서를 바꿔. 항상 뷰를 반환하며 결과는 보통 비연속적이야.permute(*dims): 모든 차원의 순서를 바꿔. 역시 뷰를 반환하며 결과는 비연속적이야.
연속성 함정은 흔하면서도 미묘한 PyTorch 버그야. 전치하거나 축 순서를 바꾼 텐서는 메모리에 비연속적으로 놓이는 경우가 많아. 일부 연산, 특히 .view()와 여러 기존 사용자 정의 CUDA 커널은 연속 메모리를 요구해. 이때는 .contiguous()로 새 연속 블록에 복사하거나 .view() 대신 .reshape()를 사용해.
크기가 1인 차원 추가·제거
unsqueeze(dim)은 dim 위치에 크기가 1인 차원을 추가하고, squeeze(dim=None)은 그런 차원을 제거해. 둘 다 데이터를 복사하지 않고 메타데이터만 바꿔. 행 벡터와 열 벡터의 모양을 맞추는 것처럼 브로드캐스팅을 준비할 때 계속 사용하게 될 거야.