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_fn이 loss함수가 된다. 클라스인 model의 nn.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")
'머신러닝' 카테고리의 다른 글
CNN을 모듈로 한 ImageNet의 발전 (0) | 2019.07.03 |
---|---|
7-25 PyTorch 뉴럴 네트워크 nn.Module 하위클라스 코딩 (0) | 2019.06.30 |
TensorFlow Graph 뉴럴 네트워크 코드 GPU 연산 시간 비교 (0) | 2019.06.29 |
NumPy 스타일 머신 러닝 코드의 PyTorch 변환 (0) | 2019.06.29 |
NumPy 라이브러리에 의한 뉴럴 네트워크 코드의 머신 러닝 특성 (0) | 2019.06.28 |