부스트캠프 AI Tech

2주차 - Pytorch 기본

이니니 2022. 9. 29. 14:45

2강. PyTorch Basics

pytorch는 딥러닝을 만드는데 가장 기본적인 프레임워크이다. pytorch는 numpy를 기반으로 했기 때문에 그 사용법이 유사하다. pytorch는 numpy와 AutoGrad에 대한 많은 딥러닝 모듈들을 제공한다.

 

numpy에서 list를 표현하기 위해서는 ndarray를 사용하였다. pytorch에서는 list를 표현하기 위해 Tensor를 사용한다. Tensor에 대한 설명은 다음과 같다.

  • 다차원 arrays를 표현하는 pytorch 클래스
  • numpy의 ndarray와 동일, Tensorflow의 Tensor와도 동일
  • Tensor를 생성하는 함수도 거의 동일

 

# numpy _ ndarray
import numpy as np

n_array = np.arange(10).reshape(2,5)

print(n_array)
print("ndim :", n_array.ndim, "shape :", n_array.shape)
[[0 1 2 3 4]
 [5 6 7 8 9]]
ndim : 2 shape : (2, 5)
# pytorch - tensor
import torch

t_array = torch.FloatTensor(n_array)

print(t_array)
print("ndim :", t_array.ndim, "shape :", t_array.shape)
tensor([[0., 1., 2., 3., 4.],
            [5., 6., 7., 8., 9.]])
ndim : 2 shape : torch.Size([2, 5])

 

기본적으로 tensor가 가질 수 있는 data type은 numpy와 동일하다. 하지만 다른점은 GPU의 사용여부이다.

# cpu에 올라와 있는 경우
device(type='cpu')
## device(type='cpu')

# GPU에 올라와 있는 경우
if torch.cuda.is_available():
    x_data_cuda = x_data.to('cuda')
x_data_cuda.device
## device(type='cuda', index=0)

 

Tensor handling

  • view : reshape과 동일하게 tensor의 shape을 변환시킨다.
  • squeeze : 차원의 개수가 1인 차원을 삭제한다.(압축시킨다)
  • unsqueeze : 차원의 개수가 1인 차원을 추가한다.

view는 단순히 copy를 한 것이 아니라, 기존에 있던 메모리 주소를 그대로 사용하고, 표현하는 형태만 바꾼다는 점에서 reshape과 다르다. 즉, contiguity 보장의 차이이다. (웬만하면 view를 쓰는게 좋다~)

 

squeeze와 unsqueeze는 아래와 같이 이해해보자!

tensor_ex = torch.rand(size=(2, 1, 2))
tensor_ex.squeeze()
## tensor([[0.4737, 0.9367],
        [0.5274, 0.7034]])
        
tensor_ex = torch.rand(size=(2, 2))
tensor_ex.unsqueeze(0).shape
## torch.Size([1, 2, 2])

tensor_ex.unsqueeze(1).shape
## torch.Size([2, 1, 2])

tensor_ex.unsqueeze(2).shape
## torch.Size([2, 2, 1])

 

pytorch에서 행렬 곱셈 연산은 dot이 아닌 mm을 사용한다. 

n1 = np.arange(10).reshape(2,5)
n2 = np.arange(10).reshape(5,2)
t1 = torch.FloatTensor(n1)
t2 = torch.FloatTensor(n2)

t1.mm(t2)
## tensor([[ 60.,  70.], [160., 195.]])

 

mm과 matmul은 같은 기능을 한다. 다른 점은, matmul만 broadcasting 지원을 한다는 것이다.

# mm
a = torch.rand(5,2, 3)
b = torch.rand(5)
a.mm(b)
## Error


# matmul
a = torch.rand(5,2, 3)
b = torch.rand(3)
a.matmul(b)
## tensor([[0.9459, 1.4297],
##        [0.8830, 0.9940],
##        [1.0772, 1.5212],
##        [1.1993, 0.7870],
##        [1.1071, 1.0766]])

 

nn.functional 모듈을 통해 다양한 수식 변환을 지원한다. ( ex. softmax, one_hot )

 

pytorch의 핵심은 자동 미분을 지원한다는 점이다. 이 때, backward 함수를 사용한다.

w = torch.tensor(2.0, requires_grad=True)
y = w**2
z = 10*y + 50
z.backward()
w.grad
## tensor(40. )

보통 미분이 되는 대상은 requires_grad = True 로 설정해준다. 


Quiz

# 1. b와 c에 알맞은 결과 구하기

import torch

a = torch.zeros(4,2)
b = a.view(2,4)
a.fill_(1)
## b = tensor([[1., 1., 1., 1.], [1., 1., 1., 1.]])


a = torch.zeros(4,2)
c = a.t().reshape(8)
a.fill_(1)
## c =tensor([0., 0., 0., 0., 0., 0., 0., 0.])

 

# 2. 수식을 자동미분하는 수식 중 틀린 부분을 고쳐라 

import torch

a = torch.tensor([2., 3.], requires_grad=False)
b = torch.tensor([6., 4.], requires_grad=False)
Q = 4 * a **5 - b **3
external_grad = torch.tensor([1.,1.])
Q.backward(gradient = external_grad)
print(a.grad)
print(b.grad)
## a와 b에서 미분 대상은 requires_grad=True로 설정해주어야 한다.

회고

pytorch에 대해 자세히 배운건 처음이었다. 이번 기회로 인해 pytorch를 python처럼 자유자재로 사용할 수 있도록 많이 연습하고 노력할 것이다.


위 내용은 부스트캠프 AI Tech 에서 제공한 내용을 바탕으로 작성하였습니다.

'부스트캠프 AI Tech' 카테고리의 다른 글

3주차 - 최적화  (0) 2022.10.05
3주차 - 딥러닝 기본  (0) 2022.10.04
2주차 - PyTorch 구조 학습하기  (0) 2022.09.30
1주차 - AI Math (9/19 ~ 9/23)  (1) 2022.09.23
1주차 - Python (9/19 ~ 9/23)  (1) 2022.09.23