꺼내먹는지식 준

Pytorch 기본기 본문

AI/PyTorch

Pytorch 기본기

알 수 없는 사용자 2022. 1. 24. 11:50

Pytorch의 강점 

 

1) Numpy

2) AutoGrad

3) Deep Learning을 지원하는 다양한 함수와 모델 

 

Tensor 

 

다차원 Arrays를 표현하는 Pytorch 클래스 

사실상 numpy의 ndarray와 동일 

 

1) Tensor를 생성하는 함수도 거의 동일 

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

import torch
t_array = torch.FloatTensor(n_array)

결과 

tensor[[0., 1., 2., 3., 4.] [5., 6., 7., 8., 9.]]

shape(2,5)

 

data to tensor , ndarray to tensor

data = [[3,5],[10,5]]
x_data = torch.tensor(data)


nd_array_ex = np.array(data)
tensor_array = torch.from_numpy(nd_array_ex)

 

기본적으로 tensor가 가질 수 있는 data 타입은 numpy와 동일하나 GPU를 쓸 수 있게 해주는 기능만 추가 

 

기본적으로 numpy의 대부분 사용법이 그대로 적용됨 

indexing 기법, flatten, ones_like

GPU로 데이터 올리는 법 

x_data.device

#device(type = 'cpu')



if torch.cudo.is_available():

    x_data_cuda = x_data.to('cuda')

x_data_cuda.device

#device(type = 'cuda', index=0)

 

2) Tensor 크기 조정

view, squeeze, unsqueeze 등으로 tensor 조정가능 

view: reshape과 동일한 기능 tensor의 shape 변환 

view: copy하는 것이 아니라, 기존 값의 메모리 주소 그대로 사용하고 형태만 바꿔준다. 

reshape: 메모리의 주소 형태가 보장되는 상황에는 메모리 주소를 그대로 사용하나, 그렇지 않은 경우에는 copy를 한다. 

view를 쓰자. 

 

squeeze: 차원의 개수가 1인 차원을 삭제 (압축)

unsqueeze: 차원의 개수가 1인 차원 추가 

unsqueeze(0) #0은 첫번째 차원 

(a,b,c)

...

unsqueeze(-1) #-1은 마지막 차원

(a,b,c)

3)  Tensor Operation

numpy와 거의 동일 

+, - , scalar + .. 등 

 

차이점 

행렬의 내적을 구하는 numpy의 dot 대신 mm 사용 

mm 과 matmul의 차이는 matmul이 broadcasting을 지원한다는 것이다. 

불가능

가능

broadcasting이 지원되다보면, debugging이 어려워질 수 있다. 

 

지원 Operation for ML/ DL 

import torch
import torch.nn.functional as F

tensor = torch.FloatTensor([0.5, 0.7, 0.1])
h_tensor = F.softmax(tensor, dim=0)
h_tensor
#tensor([0.3458, 0.4224, 0.2318])

y = torch.randint(5, (10,5))
y_label = y.argmax(dim=1)

torch.nn.functional.one_hot(y_label)

4) AutoGrad

Pytorch의 핵심은 자동 미분의 지원 --> backward 함수 지원 

w = torch.tensor(2.0, requires_grad = True)

y = w ** 2
z = 10 * y + 25
z.backward()
w.grad

보통은 위와 같이 식을 직접 선언하지 않고, 내장 함수를 활용한다. 

ex) nn.Linear(hidden_size, output_size, bias = True), criterion(_y, y_data)

a = torch.tensor([2., 3.], requires_grad = True)
b = torch.tensor([6., 4.], requires_grad = True)
Q = 3*a**3 - b**2
external_grad = torch.tensor([1., 1.])
Q.backward(gradient = external_grad)
a.grad 
#tensor([36., 81.])
b.grad
#tensor([-12., -8.])

 

 

'AI > PyTorch' 카테고리의 다른 글

Torch Indexing  (0) 2022.01.25
Pytorch Dataset  (0) 2022.01.25
Pytorch Backpropagation(AutoGrad, Optimizer)  (0) 2022.01.25
Pytorch 프로젝트 생성, 배포, 유지보수  (0) 2022.01.24
Pytorch vs Tensorflow  (0) 2022.01.24
Comments