Python/Pytorch

[Pytorch] torch.view, torch.reshape의 사용법과 차이 비교

jimmy_AI 2022. 2. 27. 13:45
반응형

파이토치 view 함수와 reshape 함수 비교

안녕하세요. 이번 글에서는 파이토치에서 텐서의 차원 변환을 할 때 사용하는

torch.view와 torch.reshape 함수의 기본적인 사용법과

두 함수의 차이에 대하여 다루어보는 시간을 가져보겠습니다.

 

 

torch.view와 torch.reshape 함수의 원리와 사용 방법

이 두 함수의 원리는 Numpy의 reshape 함수를 기반으로 하고 있습니다.

 

해당 함수의 사용 방법은 아래의 포스팅에서 다루어, 추가 설명은 따로 하지 않도록 하겠습니다.

 

[Numpy] 배열 shape 변경 : np.reshape 함수 사용법, -1 의미

파이썬 넘파이 배열 차원 변경 함수 : np.reshape reshape 함수를 통하여 넘파이 배열의 차원을 변환하는 방법에 대해서 살펴보고, 함수 내 input으로 -1을 포함한 경우의 의미도 살펴보도록 하겠습니다

jimmy-ai.tistory.com

 

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에 대한 설명은 생략하고 넘어가겠습니다.

 

[Pytorch] contiguous 원리와 의미

torch의 contiguous에 대해서 안녕하세요. 이번 시간에는 파이토치에서 메모리 내에서의 자료형 저장 상태로 등장하는 contiguous의 원리와 의미에 대해서 간단히 살펴보도록 하겠습니다. contiguous 여부

jimmy-ai.tistory.com

 

두 함수의 차이에 대한 이해를 돕기 위하여, 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를 사용하시는 것을 권장드립니다.