파이토치는 Fackbook에서 만든 딥러닝 프레임 워크로 Tensorflow와 양대산맥을 이루다 최근 주요 딥러닝 프레임 워크로 자리 잡은 라이브러리다.
파이토치는 기본적으로 numpy + AutoGrad 즉 행렬연산과 미분기를 합친 것이라고 볼 수 있다.
넘파이는 기본적으로 아래와 같이 구성되며 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와 동일하다.
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)
텐서 연산같은 경우 기본적으로 numpy와 동일하게 브로드캐스팅이 적용된다.
matmul
행렬곱 연산으로써 쓰인다.
a = torch.rand(5,2,3) b = torch.rand(5) a.matmul(b)
나머지는 넘파이랑 동일하거나 비슷하다.
파이토치의 핵심 기능으로 파이토치는 행렬 연산기와 미분기의 조합이다. backward라는 함수를 통하여 자동미분이 가능하다.
텐서의 requires_grad = True로 설정해주어야 한다.w = torch.tensor(2.0,requires_grad=True) y = w**2 z = 10*y + 25 z.backward() w.grad
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])
새로운 주가 시작되고 몸도 괜찮아 진것 같다. 드디어 파이토치를 배우기 시작했는데 전에 많이 사용해봐서 익숙한 내용들이었다. 넘파이와 기능도 너무 동일하다 보니 numpy에다가 자동미분기 하나 추가한 정도라고 봐도 무방하였다. 슬슬 부스트캠프에 적응 돼서 그런지 10시 당장은 졸립지만 10시 10분쯤 되면 정신이 다시 맑아지는 이상한 효과가 있다...