상세 컨텐츠

본문 제목

강의 복습내용 [week2-1] 파이토치 기초

Ai_tech_5기/2주차 PyTorch

by leeheemna97 2023. 3. 13. 12:20

본문

728x90
반응형

PyTorch -> numpy + AutoGrad

 

Tensor

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

- 사실상 numpyndarray와 동일(TensorFlowTensor와 동일)

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

 

 

numpy to tensor

import numpy as np
n_array = np.arange(10).reshape(2,5)
print(n_array)
print("ndim : ", n_array.ndim, "shape : ", n_array.shape)

 

import torch
t_array = torch.FloatTensor(n_array)
print(t_array)
print("ndim : ", t_array.ndim, "shape : ", t_array.shape)

 

data to tensor

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

 

ndArray to tensor

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

 

기본적으로 tensor가 가질 수 있는 data 타입은 numpy와 동일

     한 가지 다른점은 GPU를 쓸 수 있다는 것!

 

기본적으로 numpy에서 사용하던 사용법이 PyTorch에 그대로 적용됨

 

 

 

Tensor handling

- view : reshape과 동일하게 tensor의 shape를 변환

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

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

 

tensor_ex = torch.rand(size = (2,3,2))
tensor_ex.view([-1,6])

tensor_ex.reshape([-1,6])

 

squeeze

 

Tensor operations

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

t1+t1

t1-t1

t1+10

 

행렬곱셈 연산은 dot이 아닌 mm 사용

 

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

 

t1.dot(t2)

 

 

t1.matmul(t2)

 

mm은 matmul은 broadcasting 지원에서 차이가 있음

matmul은 broadcasting을 지원함 -> 결과를 햇갈리게 하는 요소가 있으므로 반드시 이해가 필요

 

 

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

 

 

a = torch.rand(5, 2, 3)
b = torch.rand(3)
a.matmul(b)

a=torch.rand(5,2,3)에서

첫번째 5는 batch를 의미

2 by 3와 3 by 1의 연산

-> 2 by 1 으로 5개가 찍힘!

 

a[0].mm(torch.unsqueeze(b,1))

 

a[1].mm(torch.unsqueeze(b,1))

a[2].mm(torch.unsqueeze(b,1))

a[3].mm(torch.unsqueeze(b,1))

a[4].mm(torch.unsqueeze(b,1))

 

 

Torch는 numpy와 operation이 거의 비슷하다

reshape 대신 view를 쓰세요

unsqueeze와 squeeze의 차이를 이해하라

mm과 dot, matmul의 차이를 알면 좋겠다!

 

 

 

Tensor operations for ML/DL formula

nn.functional 모듈을 통해 다양한 수식 변환을 지원함!

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

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

y_label

torch.nn.functional.one_hot(y_label)

import itertools
a = [1,2,3]
b = [4,5]
list(itertools.product(a,b))

tensor_a = torch.tensor(a)
tensor_b = torch.tensor(b)
torch.cartesian_prod(tensor_a, tensor_b)

 

AutoGrad

PyTorch의 핵심은 자동 미분의 지원 -> backward 함수 사용

w = torch.tensor(2.0, requires_grad=True) ##미분하는 변수
y = w**2
z = 10*y + 25
z.backward() 
w.grad ## z를 w로 미분한값

 

 

편미분

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

b.grad

 

728x90
반응형

관련글 더보기

댓글 영역