data 가 보이는 모양 만 바꾸는 세 op
이 op 들 중 어느 것도 byte 를 옮기지 않아 (옮겨야 하면 빼고). stride 만 바꿔 — PyTorch 가 메모리를 걷는 recipe. stride 이해는 tensor 를 알기와 tensor 를 사용하기의 차이.
네 op
reshape(*shape)— 가장 유연. memory 가 허락하면 view, 아니면 copy. 항상 작동.view(*shape)— view only. tensor 가 contiguous 아니면 에러.transpose(d0, d1)/.T— 두 dim swap. 항상 view 반환, 결과는 non-contiguous.permute(*dims)— 모든 dim reorder. view, non-contiguous.
contiguous 함정이 가장 흔한 미묘한 PyTorch 버그야. transpose 나 permute 후 tensor 는 메모리에 non-contiguous 하게 놓여. 일부 op (특히 .view() 와 많은 옛 custom CUDA kernel) 가 contiguous 메모리 요구. 해결: .contiguous() (새 contiguous block 으로 copy) 또는 .view() 대신 .reshape() 사용.
크기-1 dim 추가/제거
unsqueeze(dim) 은 dim 위치에 size-1 dim 추가. squeeze(dim=None) 은 size-1 dim 제거. 둘 다 순수 metadata 변경 — copy 없음. broadcast 위해 shape 맞추는 데 끊임없이 필요해 (row vs column vector 상황).