머신러닝

PyTorch 뉴럴 네트워크 nn.Sequential 클라스 코딩

coding art 2019. 6. 30. 12:51
728x90

PyTorch 가제공하는 뉴럴 네트워트 클라스 nn을 살펴보자. 그 사용법은 Keras Sequential 과 아주 흡사하다. 그 내부에서 nn.Linear, nn.ReLU, nn.Linear 로 구성되며 각 nn.Linear 별로 내부에서 웨이트 매트릭스 w1 w2 가 계산되어 넘겨진다. 메인 학습 루틴에서 method 명령인 .parameter()에 의해 넘겨받아 Backpropagation 계산을 위해 사용할 수 있다. nn.MSELoss(reduction=’sum’)TensorFlow 에서의 tf.reduce_mean 명령과 유사해 보인다.




learning rate 를 설정 후 500회 학습을 하기로 한다. 함수 loss_fnloss함수가 된다. 클라스인 modelnn.Linear()에서 계산하는 gradient 값을 학습 루틴 내에서 초기화 하자. loss.backward() 명령에 의해 Backpropagation 계산을 시작 하지만 이 코드에서는 겉으로 드러난 웨이트 파라메터가 보이지 않는다. 하지만 .no_grad() 명령에 의해서 클라스인 model로부터 .parameters() 에 의해 넘겨받는 파라메터 값들 여기에서는 param 으로 표현되어 있는데 이는 바로 웨이트 매트릭스 w1 w2에 해당하며 업데이트를 시키도록 한다.


.no_grad() 명령이 선행되어야 외부 클라스로부터 받아오는 파라메터에 대한 gradient 계산이 가능해진다. 이러한 기법은 PyTorch에서 클라스 별로 구조화된 코딩 작업애 병행해 반드시 사용해야 할 필요가 있다.

 

Colabo에서 GPU 설정 후 연산에 소요되는 시간은 0.78초로 TensorFlow와 비슷하다


#pytorch_sequential

import torch
import time

start_time = time.time()


N, D_in, H, D_out = 64, 1024, 100, 10

x = torch.randn(N, D_in)
y = torch.randn(N, D_out)

model = torch.nn.Sequential(
    torch.nn.Linear(D_in, H),
    torch.nn.ReLU(),
    torch.nn.Linear(H, D_out),
)

loss_fn = torch.nn.MSELoss(reduction='sum')

learning_rate = 1e-4
for t in range(500):

    y_pred = model(x)

    loss = loss_fn(y_pred, y)
    if t % 100 == 0:
      print(t, loss.item())

    model.zero_grad()

    loss.backward()
   
    with torch.no_grad():
      for param in model.parameters():
        param -= learning_rate * param.grad

end_time = time.time()
print( "Completed in ", end_time - start_time , " seconds")