욤미의 개발일지

4. 파이토치 기초(PyTorch Basic): View, Squeeze, Unsqueeze 본문

PyTorch

4. 파이토치 기초(PyTorch Basic): View, Squeeze, Unsqueeze

욤미 2023. 3. 30. 17:25
728x90
반응형

📌 구글 colab에서 실습한 내용


1. 뷰(View)

✨매우 중요✨

  • 원소의 개수를 유지하면서 텐서의 크기를 변경한다.
  • 사이즈가 -1로 설정되면 다른 차원으로 부터 해당 값을 유추한다.
  • Numpy의 Reshape와 같은 역할을 수행한다.

임의의 3차원 텐서를 만들고 크기를 변경해본다.

import torch
import numpy as np

t = np.array([[[0,1,2],
               [3,4,5]],
              [[6,7,8],
               [9,10,11]]])

ft = torch.FloatTensor(t) # 3차원 numpy array를 3차원 tensor로
print(ft.shape) # 텐서의 크기(shape)확인, torch.Size([2, 2, 3]) 차원, 행, 열
'''
torch.Size([2, 2, 3])
'''

1) 3차원 텐서 → 2차원 텐서

ft.view([-1, 3])는 ft라는 텐서를 (?, 3)의 크기로 변경한다.

  • -1: 첫번째 차원은 사용자가 잘 모르겠으니 파이토치가 알아서 계산하도록 하는 것
  • 3: 두번째 차원은 3으로 지정

결과적으로 (2, 2, 3) → (2×2, 3) → (4, 3)의 크기를 가지는 텐서로 변경한다.

print(ft.view([-1, 3])) # 원래 ft의 형태를 바꾸지는 않음
print(ft.view([-1, 3]).shape) # torch.Size([4, 3])
'''
tensor([[ 0.,  1.,  2.],
        [ 3.,  4.,  5.],
        [ 6.,  7.,  8.],
        [ 9., 10., 11.]])
torch.Size([4, 3])
'''

2) 3차원 텐서 → 다른 크기의 3차원 텐서

원소 개수가 유지되어야하기 때문에 (2, 2, 3)텐서를 (?, 1, 3)텐서로 바꾸려면
? 차원은 4가 된다.

print(ft.view([-1,1,3]))
print(ft.view([-1,1,3]).shape) # torch.Size([4, 1, 3])
'''
tensor([[[ 0.,  1.,  2.]],

        [[ 3.,  4.,  5.]],

        [[ 6.,  7.,  8.]],

        [[ 9., 10., 11.]]])
torch.Size([4, 1, 3])
'''

2. 스퀴즈(Squeeze)와 언스퀴즈(Unsqueeze)

  • squeeze: 차원이 1인 경우 해당 차원을 제거
  • unsqueeze: 특정 위치에 1인 차원 추가(squeeze와 정반대 역할)
    • 0부터 첫번째 차원을 의미
    • -1은 마지막 차원을 의미

(3 × 1) 크기의 2차원 텐서를 squeeze하면 1이었던 두번째 차원을 제거한다.

→ (3,) 크기의 1차원 벡터

ft = torch.FloatTensor([[0],[1],[2]])
print(ft)
print(ft.shape)
'''
tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])
'''

print(ft.squeeze())
print(ft.squeeze().shape)
'''
tensor([0., 1., 2.])
torch.Size([3])
'''

(3,) 크기의 1인 차원 텐서를 unsqueeze(0) 하면 인자 0을 의미하는 첫번째 차원에 1인 차원이 추가된다.

→ (1,3) 크기의 2차원 텐서

ft = torch.FloatTensor([0,1,2])
print(ft)
print(ft.shape)
'''
tensor([0., 1., 2.])
torch.Size([3])
'''

print(ft.unsqueeze(0)) # 인덱스가 0부터 시작, 0 = 첫번째 차원 의미
print(ft.unsqueeze(0).shape)
'''
tensor([[0., 1., 2.]])
torch.Size([1, 3])
'''

(3,) 크기의 1인 차원 텐서를 unsqueeze(1) 하면 인자 1을 의미하는 두번째 차원에 1인 차원이 추가된다.

→ (3,1) 크기의 2차원 텐서

print(ft.unsqueeze(1)) # 인덱스가 0부터 시작, 0 = 첫번째 차원 의미
print(ft.unsqueeze(1).shape)
'''
tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])
'''
728x90
반응형
Comments