본문 바로가기

인공지능/딥러닝

[딥러닝] view, reshape 차이? 모델링 차원 크기 변경 방법

딥러닝 모델을 만들때 데이터 처리기술은 정말로 중요하다. 

 

처음 모델링을 한다면 위의 4가지 특징에 대하여 혼란이 있을 수 있다. 

따라서 한번 정리해보려 한다. 

 

딥러닝에서 view, squeeze, unsqueeze, reshape 는 텐서의 모양을 조작하고 변형하는데 중요한 연산작용을 한다. 이에 대한 각각의 기능과 예제를 통해 알아보자. 

 

1. view (차원 변경)

- view는 텐서의 원소의 개수를유지하면서 차원을 조정한다. 아래의 예시를 보면 원본 텐서 생성이 12이고 

12의 약수가 3 *4 이다. 따라서 이 원소의 개수를 유지하면서 차원을 변경한 형태이다. 

import torch

# 원본 텐서 생성
x = torch.arange(12)

# 텐서의 모양을 (3, 4)로 변경
y = x.view(3, 4)

print("Original Tensor:")
print(x)
print("Reshaped Tensor:")
print(y)

 

따라서 view를 이용하여 원하는 모양으로 변경하고자 할때 한번더 진행하면 아래와 같이 된다. 

import torch

# 크기가 (3, 4)인 텐서 생성
x = torch.randn(3, 4)

# 크기를 (2, 6)으로 변경
y = x.view(2, 6)

print("Original Tensor:")
print(x.size())
print("Tensor after view:")
print(y.size())

 

2. reshape

reshape 또한 원소의 개수를 유지하면서 텐서의 모양을 변경하는데 사용된다. 

import torch

# 원본 텐서 생성
x = torch.arange(12)

# 텐서의 모양을 (3, 4)로 변경
y = x.reshape(3, 4)

print("Original Tensor:")
print(x)
print("Reshaped Tensor:")
print(y)

 

reshape 에서 중요하게 생각할 것이 바로 -1 과 1 이다. reshape 함수에서 -1과 1을 사용하여 텐서의 차원을 조절하면 텐서의 크기를 자동으로 계산할 수 있어 딥러닝에서 유용하게 사용된다. 

 

아래는 -1을 이용한 예시이다. 

import torch

# 크기가 (2, 3, 4)인 텐서 생성
x = torch.randn(2, 3, 4)

# -1을 사용하여 마지막 차원의 크기를 자동으로 계산
y = x.reshape(-1)

print("Original Tensor:")
print(x.size())
print("Tensor after view:")
print(y.size())

 

위의 예시의 경우, 크가가 (2,3,4) 인 경우 (2*3*4,) 인 (24,) 로 텐서를 변환한다. 

그러면 1을 이용한 경우 어떻게 될까?

import torch

# 크기가 (2, 3, 4)인 텐서 생성
x = torch.randn(2, 3, 4)

# 1을 사용하여 차원을 추가하고 크기를 변경
y = x.reshape(2, 1, -1)

print("Original Tensor:")
print(x.size())
print("Tensor after view:")
print(y.size())

 

위의 예제에서는 (2,3,4) 의 텐서의 크기가 (2,1,12) 로 변환한다. 따라서 reshape 에서의 마지막 인지에 -1을 추가하면 가운데 차원에 1이되고, 마지막 차원에는 12 가 되어 마지막 차원의 크기를 자동으로 계산한다.

 

y = x.reshape(2, 1, -1) 에서 

 

첫번째 숫자 2의 의미: 첫번째 차원을 의미하며 이 경우 새로운 텐서y의 첫번째 차원은 원래 텐서 x의 두번째 텐서의 차원과 일치한다.

두번째 숫자 1의 의미 : 두번째 차원의 크기를 1로 설정하며 따라서 새로운 차원 y의 두번째 차원이 1이 된다. 이로써 y 는두번째 차원에 새로운 차원을 추가한 것이 된다. 

세번째 숫자 -1의 의미 : 이부분은 앞선 부분과 다르게 -1로사 차원을 자동 계산하게 된다. 따라서 세번째 차원의 크기는 원래 x의 나머지 차원들의 원소개수에 따라 자동으로 결정된다. 

 

view, reshape 차이?

view와 reshape는 기본적으로 유사하게 작동하지만 pytorch 에서 view는 continguous 한 텐서에만 사용가능하고 reshape는 continguous 여부에 관계없이 사용가능하다. 따라서 위에서 언급했던 -1과 1의 사용은 view와 reshape 에서 모두 사용가능하다.