NumPy 라이브러리 쳬계하에서 작성한 앞서의 머신 러닝 코드를 PyTorch로 변환하는 작업은 대단히 쉽지만 왜 PyTorch로 바꾸면 좋은지 그 이유는 알아야 하지 않겠는가? 그 이우는 너무나 간단하다. GPU 컴퓨팅이 가능해지는 것이 큰 장점이다. 구글 Colabo를 쓴다면 이 조차 필요 없을지도 모른다. 왜냐면 NumPy 스타일 코드 전체를 GPU 와 연결해서 실행시키는 것이 가능하기 때문일 것이다. 하지만최 전선에서 머신 러닝의 발전상을 조망해보면 시급히 해결되어야 할 분야가 ImageNet과 같은 빅 데이터급의 데이터베이스를 활용한 개인 사용자나 자율주행차량의 Transfer Learning에 의한 이미지 분석 업무일 것이다.
인터넷 공간을 샅샅이 뒤져보면 Transfer Learning 이 가능하다고 언급된 사이트는 흔한 편인데 제대로 되는 경우는 거의 없는 듯하다. 하지만 확실한 결과를 주는 유알한 예제가 바로 PyTorch 의 Transfer Learning 예제로서 필수적으로 다루어보아야 하는 머신 러닝 코드일 것이다.
물론 GPU 컴퓨팅 지원이 필수적이므로 구글이 제공하는 무료 GPU 컴퓨팅 서비스 Colabo와 연결하여 누구라도 실행시켜 볼 수 있다는 점이다. 지금 당장은 유선 인터넷 망에서 하지만 곧 데이터 통신이 저렴해진다면 5G 통신에 의해서도가능해질 것이다. 아직은 Transfer Learning 예제 조차도 3분 가량의 시간이 소요되는데 0.1초 이내로 반응 시간을 줄여야 실용화가 가능하리라 본다.
NumPy 머신 러닝 코드를 PyTorch 스타일로 바꾸어 보자. numpy에서 매트릭스 곱셈 연산이 PyTorch에서 method 형태의 .mm(matrix multiplication)으로 바뀌는 정도이다.
코드의 헤더 영역에 GPU 사용을 위한 cuda:0 코드가 있는데 구글 Colabo를 사용할 경우에는 GPU 모드로 설정하면 “cpu” 모드에 상관없이 GPU기 실행된다.
구글 Colabo GPU 모드 실행 시 cpu 모드에서 1.0초가량 소요되던 것이 0.6초 수준으로 줄어 들었다.
#pytorch_nn
import torch
import time
import matplotlib.pyplot as plt
start_time = time.time()
dtype = torch.float
device = torch.device("cpu")
#device = torch.device("cuda:0") # Uncomment this to run on GPU
N, D_in, H, D_out = 64, 1000, 100, 10
x = torch.randn(N, D_in, device=device, dtype=dtype)
y = torch.randn(N, D_out, device=device, dtype=dtype)
w1 = torch.randn(D_in, H, device=device, dtype=dtype)
w2 = torch.randn(H, D_out, device=device, dtype=dtype)
t_list = []
loss_list = []
learning_rate = 1e-6
for t in range(500):
h = x.mm(w1)
h_relu = h.clamp(min=0)
y_pred = h_relu.mm(w2)
loss = (y_pred - y).pow(2).sum().item()
#print(t, loss)
loss_list.append(loss)
t_list.append(t)
if t % 100 == 0:
print(t, loss)
grad_y_pred = 2.0 * (y_pred - y)
grad_w2 = h_relu.t().mm(grad_y_pred)
grad_h_relu = grad_y_pred.mm(w2.t())
grad_h = grad_h_relu.clone()
grad_h[h < 0] = 0
grad_w1 = x.t().mm(grad_h)
w1 -= learning_rate * grad_w1
w2 -= learning_rate * grad_w2
plt.plot(t_list, loss_list)
plt.ylabel('Loss')
plt.xlabel('n')
plt.show()
end_time = time.time()
print( "Completed in ", end_time - start_time , " seconds")
'머신러닝' 카테고리의 다른 글
PyTorch 뉴럴 네트워크 nn.Sequential 클라스 코딩 (0) | 2019.06.30 |
---|---|
TensorFlow Graph 뉴럴 네트워크 코드 GPU 연산 시간 비교 (0) | 2019.06.29 |
NumPy 라이브러리에 의한 뉴럴 네트워크 코드의 머신 러닝 특성 (0) | 2019.06.28 |
초보자를 위한 선형회귀법 예제 PyTorch 코딩 (0) | 2019.06.27 |
단 1 시간이면 가능한 머신 러닝 초보자를 위한 구글 Colab 노트북에의 초대 (0) | 2019.06.26 |