概要
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())
以上。