Published on

파이토치 차원 변경(reshape,view,permute) 비교

Authors
  • avatar
    Name
    Inhwan Cho
    Twitter

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 : 여러 연산을 통해 차원 관리를 쉽게 할 수 있다.