Neural Network 예제


In [6]:
%matplotlib inline

Tensorflow로 구현되어 있는 golbin님의 예제에서 같은 문제를 가지고 pytorch로 구현하도록 하겠습니다.

털과 날개가 있는지 없는지에 따라서 포유류와 조류를 분류하는 신경망 모델입니다.

pytorch의 정형화된 구조

pyTorch는 다음과 정형화된 형태를 사용할 수 있을 것으로 보입니다.

1. 입력변수 설정(생성)


In [61]:
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F

# [털, 날개]
x_data = torch.Tensor(
    [[0, 0], [1, 0], [1, 1], [0, 0], [0, 0], [0, 1]])

# 0: 기타 , 1: 포유류, 2: 조류
y_data = torch.LongTensor([0, 1, 2, 0, 0, 2])

2. 사전 설정

* model
* loss
* opimizer

In [62]:
#commnet
class _model(nn.Module) :
    def __init__(self):
        super(_model, self).__init__()
        self.fc1 = nn.Linear(2, 10)
        self.fc2 = nn.Linear(10, 3)
        
    def forward(self, net):
        net = net.view(-1, 2)
        net = F.relu(self.fc1(net))
        net = self.fc2(net)
        return F.log_softmax(net) 
    
model = _model()
loss_fn = nn.NLLLoss() 
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

3. Trainning loop

* (입력 생성)
* model 생성
* loss 생성
* zeroGrad
* backpropagation
* optimizer step (update model parameter)

In [65]:
# trainning
for i in range(100) :
    # input variable
    x = Variable(x_data)
    y = Variable(y_data)
    # network model
    y_pred = model(x)
    loss = loss_fn(y_pred, y)
    # zero_grad, backward, step(update parameter) in series
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    if i % 10 == 0:
        print(i, loss.data[0])


0 0.2583054006099701
10 0.2541429102420807
20 0.25002428889274597
30 0.24598340690135956
40 0.24201278388500214
50 0.2381071299314499
60 0.2342490404844284
70 0.23045295476913452
80 0.2267329841852188
90 0.22306735813617706

4. Predict


In [66]:
y_pred = model(x).max(1)[1]
print('prediction :', y_pred.data)
print('true :', y)


prediction : 
 0
 1
 2
 0
 0
 2
[torch.LongTensor of size 6x1]

true : Variable containing:
 0
 1
 2
 0
 0
 2
[torch.LongTensor of size 6]