2016-12-12 7 views
0

Я пытаюсь использовать пакет цепочки для большого проекта, над которым я работаю. Я прочитал учебное пособие на своем веб-сайте, в котором приведен пример применения его к набору данных MNIST, но он не кажется легко масштабируемым для других примеров, и в противном случае просто недостаточно документации.Использование пакета глубоких нейронных сетей «Цепь» для обучения простого набора данных

Их пример кода выглядит следующим образом:

class MLP(Chain): 
    def __init__(self, n_units, n_out): 
     super(MLP, self).__init__(
      # the size of the inputs to each layer will be inferred 
      l1=L.Linear(None, n_units), # n_in -> n_units 
      l2=L.Linear(None, n_units), # n_units -> n_units 
      l3=L.Linear(None, n_out), # n_units -> n_out 
     ) 

    def __call__(self, x): 
     h1 = F.relu(self.l1(x)) 
     h2 = F.relu(self.l2(h1)) 
     y = self.l3(h2) 
     return y 

train, test = datasets.get_mnist() 
train_iter = iterators.SerialIterator(train, batch_size=5, shuffle=True) 
test_iter = iterators.SerialIterator(test, batch_size=2, repeat=False, shuffle=False) 
model = L.Classifier(MLP(100, 10)) # the input size, 784, is inferred 
optimizer = optimizers.SGD() 
optimizer.setup(model) 
updater = training.StandardUpdater(train_iter, optimizer) 
trainer = training.Trainer(updater, (4, 'epoch'), out='result') 
trainer.extend(extensions.Evaluator(test_iter, model)) 
trainer.extend(extensions.LogReport()) 
trainer.extend(extensions.PrintReport(['epoch', 'main/accuracy', 'validation/main/accuracy'])) 
trainer.extend(extensions.ProgressBar()) 
trainer.run() 

Может кто-то мне точку в направлении, как просто поместить прямую линию на несколько точек данных в 2D? Если я могу понять простую форму, такую, как это, я должен иметь возможность масштабироваться соответствующим образом.

Спасибо за помощь!

+0

Есть функции затрат, основанный на Наименьший евклидово расстояние – Natecat

+0

Я понимаю, как это сделать математически, мой вопрос заключается в большей степени сосредоточены на том, как это сделать конкретно с пакетом Chainer. –

ответ

0

Здесь я наклеил простое регрессионное моделирование.

Вы можете использовать исходные данные поезда и данные испытаний как кортеж. поезд = (данные, этикетка)

Здесь data.shape = (Количество данных, Количество dimesion данных)

И label.shape = (Количество данных)

Оба их тип данных должен быть numpy.float32.

import chainer 
from chainer.functions import * 
from chainer.links import * 
from chainer.optimizers import * 

from chainer import training 
from chainer.training import extensions 
from chainer import reporter 
from chainer import datasets 
import numpy 


class MyNet(chainer.Chain): 

    def __init__(self): 
     super(MyNet, self).__init__(
      l0=Linear(None, 30, nobias=True), 
      l1=Linear(None, 1, nobias=True), 
     ) 

    def __call__(self, x, t): 
     l0 = self.l0(x) 
     f0 = relu(l0) 
     l1 = self.l1(f0) 
     f1 = flatten(l1) 
     self.loss = mean_squared_error(f1, t) 
     reporter.report({'loss': self.loss}, self) 
     return self.loss 


def get_optimizer(): 
    return Adam() 


def training_main(): 
    model = MyNet() 

    optimizer = get_optimizer() 
    optimizer.setup(model) 

    train, test = datasets.get_mnist(label_dtype=numpy.float32) 
    train_iter = chainer.iterators.SerialIterator(train, 50) 
    test_iter = chainer.iterators.SerialIterator(test, 50, 
               repeat=False, 
               shuffle=False) 

    updater = training.StandardUpdater(train_iter, optimizer) 
    trainer = training.Trainer(updater, (10, 'epoch')) 
    trainer.extend(extensions.ProgressBar()) 
    trainer.extend(extensions.Evaluator(test_iter, model)) 
    trainer.extend(
     extensions.PlotReport(['main/loss', 'validation/main/loss'], 
           'epoch')) 
    trainer.run() 


if __name__ == '__main__': 
    training_main()