본문 바로가기
Artificial Intelligence/Deep Learning

[PyTorch] PyTorch란? 파이토치의 구성요소, 파이토치로 텐서 조작하기

by EunjiBest 2022. 11. 19.

[PyTorch] PyTorch란? 파이토치의 구성요소, 파이토치로 텐서 조작하기

 

 

PyTorch(파이토치)?

딥러닝 프레임워크에는 Tensorflow와 PyTorch가있다.

교육용이나 회사에서는 Tensorflow를 많이 사용했지만

Tensorflow에 비해서 절차가 간단하고 속도도 빨라 최근 연구소에서 PyTorch를 많이 쓰고있는 추세라고한다.

(결국에는 사용하는 프레임워크는 회사마다 다르기 때문에 둘 다 해두는 것이 좋겠다.)

나도 Tensorflow로 딥러닝을 먼저 접했지만 최근에 PyTorch로 모델링을 할 일이 있어서 공부해보기로 했다.

 

○ GPU 및 다른 가속기의 성능을 사용하기 위한 Numpy를 대체할 수 있다.

○ 신경망 구현에 유용한 자동미분 라이브러리를 제공한다.

 

 

 

 

 

PyTorch(파이토치)의 구성요소

 

 

  • torch: 텐서를 생성하는 라이브러리(numpy와 같은 다양한 수학 함수가 포함되어있다)
  • torch.autograd: 자동미분 기능을 제공하는 라이브러리
  • torch.nn: 신경망을 생성하는 라이브러리
  • torch.multiprocessing: 병럴처리 기능을 제공하는 라이브러리
  • torch.utils: 데이터 조작 등 유틸리티 기능 제공
  • torch.onnx: ONNX(Open Neural Network Exchange) 서로 다른 프레임워크 간의 모델을 공유할 때 사용

 

 

Tensor 조작하기

 

 

0. torch import 시켜주기.

import torch

 

 

 

1. 일차원 Tensor만들기.

 

>>> t = torch.FloatTensor([0., 1., 2., 3., 4., 5., 6.])
>>> print(t)
>>> print(t.dim())  # rank
>>> print(t.shape)  # shape
>>> print(t.size()) # shape

 

넘파이와 아주 유사한 문법을 가지고 있다.

torch.FloatTensor는 실수로 이루어진 차원을 만드는 것이다

dim()은 해당 Tensor의 차원을 알려준다.

shape와size()는 Tensor의 크기(모양)을 알려주는 함수이다.

 

1
torch.Size([7])
torch.Size([7])

 

t는 1차원 텐서이고 원소가 7개인 것을 알 수 있다.

 

>>> print(t[0], t[1], t[-1])  # 인덱스로 접근
>>> print(t[2:5], t[4:-1])    # 슬라이싱
>>> print(t[:2], t[3:])       # 슬라이싱

tensor(0.) tensor(1.) tensor(6.)
tensor([2., 3., 4.]) tensor([4., 5.])
tensor([0., 1.]) tensor([3., 4., 5., 6.])

 

슬라이싱과 인덱스로 원소를 꺼내오는 것도 가능하다.

 

 

2. 이차원 Tensor(행렬)만들기

 

>>> t = torch.FloatTensor([[1., 2., 3.],
                       [4., 5., 6.],
                       [7., 8., 9.],
                       [10., 11., 12.]
                      ])
>>> print(t)


tensor([[ 1.,  2.,  3.],
        [ 4.,  5.,  6.],
        [ 7.,  8.,  9.],
        [10., 11., 12.]])

 

실수로 2차원 Tensor를 만들어봤다.

 

>>> print(t.dim()) 
>>> print(t.size())

2
torch.Size([4, 3])

 

2차원의 4x3 Tensor가 만들어진 것을 볼 수 있다.

 

 

3. 브로드캐스팅(BroadCasting)

 

파이토치는 행렬의 +,- 연산을 할 때 브로드캐스팅을 자동으로 해준다.

 

>>> m1 = torch.FloatTensor([[1, 2]])
>>> m2 = torch.FloatTensor([3])
>>> print(m1 + m2)
>>> print(torch.add(m1,m2))

tensor([[4., 5.]])

 

2차원인 m1과 차원인 m2는 덧셈이나 뺄샘이 불가능하지만

파이토치에서는 가장 작은 차원인 m2를 2차원([3,3])으로 바꾸어 계산을 한다.

따라서 당연히 결과도 2차원으로 출력된다.

 

 

4. torch연산 함수

  • torch.add : 덧셈
  • torch.sub : 뺄셈
  • torch.mul : 곱셉
  • torch.div : 나눗셈
  • torch.mm : 내적(dot product)

 

5. View(뷰)

 

원소의 수를 유지하면서 텐서의 크기를 변경한다.

마치 numpy의 reshape과 같은 역할이다.

모든 데이터는 행렬로 이루어져있기 때문에 텐서의 모양을 마음대로 예상하면서 변경할 수 있으면 인공지능을 수월히 다룰 수 있을 것이라 생각한다.

 

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

 

다음과 같은 2X2X3의 3차원 행렬을 만들어보았다.

 

>>> print(t.view([-1, 3])) 
>>> print(t.view([-1, 3]).shape)

tensor([[ 0.,  1.,  2.],
        [ 3.,  4.,  5.],
        [ 6.,  7.,  8.],
        [ 9., 10., 11.]])
torch.Size([4, 3])

 

.view()함수를 활용하여 텐서의 모양을  2차원으로 변경했다.

t.view([-1, 3])는 (?,3)의 크기로 변경하라는 뜻이다.

 즉, -1은 랜덤으로 알아서 하고 두번째 차원의 길이는 3으로 가지라는 뜻이다.

(2,2,3)을 (4x2,3)으로 바꾼 것이다.

 

위에서 알 수 있듯이 크기가 바뀌더라도 원소의 개수는 같아야한다.

 

 

 

6. Squeeze(스퀴즈) / Unsqueeze(언스퀴즈)

 

tensor의 차원이 1인 경우에 해당 차원을 제거하는 함수이다.

 

>>> t = torch.FloatTensor([[0], [1], [2]])
>>> print(t)
>>> print(t.shape)

tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])

 

3X1 행렬을 Squeeze()를 사용하면

 

>>> print(ft.squeeze())
>>> print(ft.squeeze().shape)

tensor([0., 1., 2.])
torch.Size([3])

 

1이 제거되면서 (3,)라는 1차원 벡터가 된 것을 볼 수 있다.

 

>>> t = torch.Tensor([0, 1, 2])
>>> print(t.shape)

torch.Size([3])

 

unsqueeze()는 특정위치에 1인 차원을 추가할 수 있다.

 

>>> print(t.unsqueeze(0)) 
>>> print(t.unsqueeze(0).shape)


tensor([[0., 1., 2.]])
torch.Size([1, 3])

 

unsqueeze(0)은 인덱스가 0부터 시작하니 첫번째 차원을 나타낸다.

첫번째 차원에 1인 차원이 추가되는 것을 알 수 있다.

 

 

 

 

 


이 외에 다른 Tensor 연산 함수들이 많이 있지만

numpy를 torch로 바꾸는 함수가 있어서 torch로 tensor 연산을 얼마나 할진 모르겠다

 

사용하다가 필요할 때 신기한 것들이 있으면 모아두었다 업로드 하려고한다.

 

 

 

 

반응형

댓글