파이토치 차원 변경(reshape,view,permute) 비교
3가지 함수의 공통점
- reshape, view, permute는 모두 텐서의 형태(차원을 바꾸는) 기능이다.
view와 reshape
- view로 반환된 tensor는 원본 tensor와 기반이 되는 data를 공유한다. 만약 반환된 tensor의 값이 변경된다면, viewed되는 tensor에서 해당하는 값이 변경된다.
- view와 reshape은 연산 자체는 같고 기존 tensor가 변경되냐 되지 않는지의 차이가 있다.(contiguous)
- view는 붙어있는 차원 떼어낼 때 사용하면 용이하다. [A*2, B, C] -> [A, 2, B, C]
- view는 contiguous한 함수에서만 사용 가능하다.
- reshape은 contiguous 하지 않는 함수에서도 작동한다.
permute(input, dims)
- permute의 parameters에는 input=tensor, dims = index값을 입력한다.
- numpy의 transpose는 두 개의 차원을 맞교환할 수 있다. 그러나 permute()는 모든 차원들을 변경할 수 있다.
1 | x = torch.randn(2, 3, 5) |
contiguous란
- 사전적 의미는 ‘접촉하는’ 이다.
- contiguous 란 matrix 의 눈에 보이는 형태(shape) 과 실제 matrix 의 각 데이터가 저장된 위치가 같은지의 여부이다.
unsqueeze, squeeze
- batch가 1일 때 batch차원도 없애버릴 수 있기때문에 이 경우를 유의해서 사용해야한다.
1차원을 생성 및 제거를 할 경우 unsqueeze, squeeze함수가 편하다.
Summary
- view : tensor 에 저장된 데이터의 물리적 위치 순서와 index 순서가 일치할 때 (contiguous) shape을 재구성한다. 이 때문에 항상 contiguous 하다는 성질이 보유된다.
- reshape : 순서가 일치하지 않아도 shape을 재구성한 이후에 강제로 일치시킨다. 이 때문에 항상 contiguous 하다는 성질이 보유된다.
- transpose : tensor 의 index 순서는 같다는 보장이 없으므로 항상 contiguous 하지 않다.
- permute : contiguous 하지 않다.
- transpose와 permute는 transpose.contiguous()이런식으로 사용 가능하다.
- einsum : 여러 연산을 통해 차원 관리를 쉽게 할 수 있다.
파이토치 차원 변경(reshape,view,permute) 비교
http://inhwancho.github.io/2023/01/02/Study_folder/Pytorch/2023-01-02-dim-shape/