Chainer
XOR

chainerの作法

概要

chainerの作法を調べてみた。
分類。

インポート

import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, report, training, utils, Variable
from chainer import datasets, iterators, optimizers, serializers
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions

訓練データセットのイテレーション

データは、np.array
基本は、Variableなので、datasetsを使って、np.arrayをVariableにする。
TupleDatasetは、分類で使う。ラベルは、1次で与える。int32。ohe_hotかは、不明。

def make_data():
    X = np.array([[0, 0], [1, 1], [0, 1], [1, 0]], dtype = np.float32)
    T = np.array([0, 0, 1, 1], dtype = np.int32)
    return chainer.datasets.TupleDataset(X, T)

test = make_data()
train = make_data()

ミニバッチに対する前処理

ミニバッチを使う為のiterators
trainerに、流し込む。

epoch = 500
batchsize = 4
train_iter = chainer.iterators.SerialIterator(train, batchsize)
test_iter = chainer.iterators.SerialIterator(test, batchsize, repeat = False, shuffle = False)

ニューラルネットワークのForward/backward計算

モデルをつくる。
マルチレイヤーパーセプトロンを構築。
Linerは、全結合。
分類なので、Classifierを使う。

class MLP(chainer.Chain):
    def __init__(self, n_units, n_out):
        super(MLP, self).__init__(l1 = L.Linear(None, n_units), l2 = L.Linear(None, n_out))
    def __call__(self, x):
        return self.l2(F.relu(self.l1(x)))

model = L.Classifier(MLP(8, 2))

パラメータの更新

オプチマイザーに、Adamを使う。
trainingでトレーニング。

optimizer = chainer.optimizers.Adam()
optimizer.setup(model)
updater = training.StandardUpdater(train_iter, optimizer)
trainer = training.Trainer(updater, (epoch, 'epoch'), out = 'result')
trainer.run()

評価データセットにおける現在のパラメータの評価

argmax使ってるので、one_hot?

x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype = np.float32)
y = model.predictor(x).data
for i in range(4):
    print (x[i], np.argmax(y[i]), y[i])

中間結果をログに残す

プログレスバーを表示する。

trainer.extend(extensions.ProgressBar())

以上。