- Published On
파이토치 차원 변경(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()는 모든 차원들을 변경할 수 있다.
x = torch.randn(2, 3, 5)
print(x)
# tensor([[[ 0.5676, 0.4593, -0.2802, -1.9395, -1.2933],
# [-0.6459, -1.0244, -0.3164, 1.5379, 0.9390],
# [-0.2366, -1.4711, -0.6014, -0.4424, 0.1915]],
# [[-1.3794, -0.4103, 0.1862, 0.2172, 0.3282],
# [-1.9206, 1.1295, -0.4130, -0.5630, 0.9670],
# [-1.0632, 0.7054, 0.4358, -0.4522, -0.3983]]])
print(x.size())
# torch.Size([2, 3, 5])
torch.permute(x, (2, 0, 1)).size() #== x.permute(2, 0, 1)
# torch.Size([5, 2, 3])
# transpose는 두 개의 차원을 맞교환
x.tranpose(0, 3) # 0과 3의 차원을 변경(교환)
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 : 여러 연산을 통해 차원 관리를 쉽게 할 수 있다.
연관된 포스트 구경가기
1. Pytorch Dataset 클래스(상속) 파악하기!!2. Pytorch nn.Module 클래스(상속) 파악하기!!3. Pytorch Dataloader4. 맥북(Mac OS) 사용자의 Pytorch GPU를 사용법5. 파이토치로 nn모듈의 CNN사용하기6. 파이토치 함수7. 파이토치 기본 정보들8. 파이토치 차원 변경(reshape,view,permute) 비교9. Squeeze, Unsqueeze10. nn.Embedding 사용 방법11. NLP 분야의 MRC
간략히