やまメモ

やまげんによるやまげんのためのメモ

ChainerのTrainerが分からない...

この一週間, Docmentや他の紹介記事を見てChainerの使い方を勉強していたが
Trainerの使い方が意味不明…

試しに掛け算を学習させてみようと思い
入力データとして[1, 1], [1, 2], …, [9, 9]のVariableと
正解データとして[1], [2], …, [81]のVariableを用意してみた.

恐らくTrainerを使わずに実装するとあっさり動くんだろうけどなんとしてもTrainerを使ってみたい.

# -*- coding: utf-8 -*-
import numpy as np
import sys
import chainer
from chainer import cuda, Function, gradient_check, report
from chainer import 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


class MyChain(Chain):

    def __init__(self, n_units, n_out):
        super(MyChain, self).__init__(
            l1=L.Linear(None, n_units),
            l2=L.Linear(None, n_units),
            l3=L.Linear(None, n_out),
        )

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


def main():
    is_gpu = True  # CPUの場合はFalse
    xp = cuda.cupy if is_gpu else np

    batchsize = 3
    model = MyChain(32, 1)

    # x_data : トレーニングデータ
    # t_data : 正解データ
    x_data = []
    t_data = []
    for i in range(1, 10):
        for j in range(1, 10):
            x_data.append(Variable(xp.array([i, j], dtype=xp.float32)))
            t_data.append(Variable(xp.array([i * j], dtype=xp.float32)))

    # 最適化
    opt = optimizers.Adam()
    opt.use_cleargrads()
    opt.setup(model)

    train_iter = chainer.iterators.SerialIterator(x_data, batchsize)
    updater = training.StandardUpdater(train_iter, opt)
    trainer = training.Trainer(updater, (2000, 'epoch'), out='result')
    trainer.run()


if __name__ == '__main__':
    main()

一度Trainer使わずやってみようかな.