네이버 부스트캠프 5기 6일차

김태민·2023년 3월 14일
1

boostcamp

목록 보기
34/36

Pytorch

파이토치는 Fackbook에서 만든 딥러닝 프레임 워크로 Tensorflow와 양대산맥을 이루다 최근 주요 딥러닝 프레임 워크로 자리 잡은 라이브러리다.
파이토치는 기본적으로 numpy + AutoGrad 즉 행렬연산과 미분기를 합친 것이라고 볼 수 있다.

Tensor

넘파이는 기본적으로 아래와 같이 구성되며 numpy - ndarray 이다.

import numpy as np
n_darray = np.arange(10).reshape(5,2)
print(n_darray)
print(n_darray.dim,n_darray.shape)

이를 파이토치로 형식으로 표현하면 pytorch - tensor

import torch
torch_array = torch.FloatTensor(n_darray)
print(torch_array)
print(torch_array.ndim,torch_array.shape)

기본적으로 텐서는 리스트를 입력으로 받을 수 있으며 numpy 배열 또한 입력으로 받아 사용 할 수있다.

data = [[1,2,3,4],[1,2,3,4]]
new1_torch_array = torch.tensor(data)
new2_torch_array = torch.from_numpy(n_darray)

pytorch의 강점은 tensor를 GPU에서 동작시키기 위해 GPU로 이동시키는게 가능하다.

if torch.cuda.is_available():
	new2_torch_array.to('cuda')
    print(new2_torch_array.device)

수많은 문법들이 있으나 대부분 numpy와 동일하다.

tensor handling

view

view함수란 numpy의 reshape의 동일한 기능으로 tensor의 shape을 변형시킨다.

temp_tensor = torch.rand(size=(5,5,5))
temp_tensor.view([-1,10])
temp_tensor.reshpae([-1,10])

이때 view와 reshape의 차이는 contiguity 보장의 차이로 view는 메모리의 주소값 까지 복사하고 reshape은 메모리를 새로 할당한다.

squeeze

squeeze는 차원의 개수가 1인 차원을 삭제 한다.

temp_tensor = torch.rand(size=(1,3,3))
temp_tensor.squeeze()
#temp_tensor.shape = (3,3)으로 출력 

unsqueeze

unsqueeze는 차원의 개수가 1인 차원을 새로 추가한다.

temp_tensor = torch.rand(size=(3,3))
temp_tensor.unsqueeze(0).shape # (1,3,3)
temp_tensor.unsqueeze(1).shape # (3,1,3)
temp_tensor.unsqueeze(2).shape # (3,3,1)

transpose

주로 2개의 차원 순서를 바꿀시 사용

temp_tensor = torch.rand(2,3)
torch.transpose(temp_tensor,0,1)
#temp_tensor.shape = (3,2)

permute

permute는 transpose와 다르게 numpy의 실질적인 transpose라고 보면된다. 다차원 텐서에 대해 차원 순서를 변경 가능하다.

temp_tensor = torch.rand(32,32,3)
temp_tensor = temp_tensor.permute(2,0,1)
#temp_tensor.shape = (3,32,32)

tensor operations

텐서 연산같은 경우 기본적으로 numpy와 동일하게 브로드캐스팅이 적용된다.

matmul

행렬곱 연산으로써 쓰인다.

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

나머지는 넘파이랑 동일하거나 비슷하다.

AutoGrad

파이토치의 핵심 기능으로 파이토치는 행렬 연산기와 미분기의 조합이다. backward라는 함수를 통하여 자동미분이 가능하다.
텐서의 requires_grad = True로 설정해주어야 한다.

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

y=w2y=w^2
z=10y+25z=10*y+25
z=10w2+25z=10*w^2+25

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])
Q=3a3b2Qa=9a2Qb=2b\begin{aligned} & Q=3 a^3-b^2 \\ & \frac{\partial Q}{\partial a}=9 a^2 \\ & \frac{\partial Q}{\partial b}=-2 b \end{aligned}

회고

새로운 주가 시작되고 몸도 괜찮아 진것 같다. 드디어 파이토치를 배우기 시작했는데 전에 많이 사용해봐서 익숙한 내용들이었다. 넘파이와 기능도 너무 동일하다 보니 numpy에다가 자동미분기 하나 추가한 정도라고 봐도 무방하였다. 슬슬 부스트캠프에 적응 돼서 그런지 10시 당장은 졸립지만 10시 10분쯤 되면 정신이 다시 맑아지는 이상한 효과가 있다...

profile
한성대학교 네이버 AI Tech 5기 NLP

0개의 댓글