꺼내먹는지식 준
Pytorch 기본기 본문
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 |