딥러닝 모델을 만들때 데이터 처리기술은 정말로 중요하다.
처음 모델링을 한다면 위의 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 에서 모두 사용가능하다.