파이토치 view 함수와 reshape 함수 비교
안녕하세요. 이번 글에서는 파이토치에서 텐서의 차원 변환을 할 때 사용하는
torch.view와 torch.reshape 함수의 기본적인 사용법과
두 함수의 차이에 대하여 다루어보는 시간을 가져보겠습니다.
view와 reshape 함수의 기본적인 사용법을 익혀보기 위하여
아래의 간단한 12개의 원소를 가지는 1차원 텐서가 있다고 가정해보겠습니다.
import torch
x = torch.arange(12)
x # tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
view와 reshape 모두 input으로 원하는 차원의 형태를 바로 적어주시면
사용이 완료됩니다. 이 두 함수의 겉으로 보이는 반환 결과는 동일합니다.
x.reshape(3, 4)
'''
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])'''
x.view(2, 6)
'''
tensor([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])'''
1개의 차원에 한해서 -1로 값 지정이 가능한데, 이 경우 자동으로 변환이 가능한 차원이
지정되어 차원 배정이 이루어지게 됩니다.
x.reshape(2, 3, -1) # (2, 3, 2) 차원으로 자동 지정
'''
tensor([[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[ 6, 7],
[ 8, 9],
[10, 11]]])'''
x.view(2, 2, -1) # (2, 2, 3) 차원으로 자동 지정
'''
tensor([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])'''
물론, -1을 두개 이상 포함하거나, 변환이 불가능한 경우는
두 함수 모두 RuntimeError가 발생합니다.
x.reshape(2, -1, -1) # RuntimeError: only one dimension can be inferred
x.view(5, -1) # RuntimeError: shape '[5, -1]' is invalid for input of size 12
두 번째 코드는 5 * n = 12를 만족하는 자연수 n이 없어 변환이 불가능했습니다.
torch.view와 torch.reshape 함수의 차이
그렇다면, 사용 원리와 반환 결과가 동일해보이는 두 함수의 차이는 무엇일까요?
torch.view와 torch.reshape의 가장 큰 차이는 contiguous 속성을 만족하지 않는 텐서에
적용이 가능하느냐 여부입니다.
view는 contiguous 속성이 만족되지 않는 경우 일부 사용이 제한될 수 있습니다.
참고로, contiguous 속성이 무엇인지에 대해서는 아래 글을 참고하시면
이해에 큰 도움이 되실 것입니다. 여기서는 contiguous에 대한 설명은 생략하고 넘어가겠습니다.
https://davidho.tistory.com/entry/Pytorch-contiguous-%EC%9B%90%EB%A6%AC%EC%99%80-%EC%9D%98%EB%AF%B8
두 함수의 차이에 대한 이해를 돕기 위하여, transpose를 거쳐
contiguous 속성을 만족하지 않는 텐서를 1개 만들어 함수를 적용해보도록 하겠습니다.
y = torch.ones(3, 4)
y.transpose_(0, 1)
y.is_contiguous() # False
이제 이 (4, 3) 차원의 y 텐서에 (3, 2, 2) 차원으로의 변환을 시도해보겠습니다.
y.reshape(3, 2, 2) # 실행 가능
y.view(3, 2, 2) # 실행 불가
# RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.
view를 사용한 경우, reshape을 대신 사용하라는 메시지의 RuntimeError가 발생했습니다.
따라서, 차원 변환을 적용하려는 텐서의 상태에 대하여 정확하게 파악하기가 모호한 경우에는
view 대신 reshape를 사용하시는 것을 권장드립니다.
'딥러닝&머신러닝 > 파이토치 기본 문법' 카테고리의 다른 글
DataLoader num_workers에 대한 고찰 (0) | 2023.02.03 |
---|---|
[파이토치] zero_grad()의 이해 (0) | 2023.01.26 |
[Pytorch] contiguous 원리와 의미 (0) | 2023.01.10 |
[PyTorch] `model.eval()` 의미 (0) | 2023.01.10 |
[PYTORCH] POINTWISE OPS (0) | 2023.01.10 |
댓글