2017年3月14日火曜日

chainerの使い方

基本ライ ブラリのインポート

import numpy as np  import chainer  import chainer.functions as F  import chainer.links as L  from chainer import training  from chainer.training import extensions

【重要】 データについて

配列は、numpyもしくは cupyの配列となっていること。
X(入力データ)のデータ型はfloat32にしておくこと。
分類の場合:y(正解・教師データ)のデータ型はint32
回帰の場合:y(正解・教師データ)のデータ型はfloat32
そしてこのような変数と呼ばれるような物を「Variableオブジェクト」と呼びます。

型の指定方法は2つあります。

x = Variable(np.array([配列], dtype=np.float32))  

もしくは、型を変換する astypeを使用して以下のようにします。

x = Variable(np.array([配列]).astype(np.float32))

links パッケージ

linksパッケージにある関数 は、variableを変数として持ちます。
links内の関数には、パラメータがあります。

linksパッケージ内にある、 Linearモデルは代表的な関数です。

pythonでは、このように書き ます。

h = L.Linear(2,3)  

パラメータは、W(初期値ランダ ム)とb(初期値0)です。

>>> h.W.data  array([[-0.05319989,  0.57975596],         [-0.98233205, -0.06193497],         [-0.45000005,  0.76258951]], dtype=float32)      >>> h.b.data  array([ 0.,  0.,  0.], dtype=float32)  

function パッケージ

functionパッケージにある 関数は、variableを変数として持ちます。
活性化関数や、損失関数など様々な関数が実装されています。

多層パー セプトロンモデル

Chainクラス

chainerは合成関数内に 含まれるパラメータを学習します。
chainクラスはモデルである合成関数を定義するためのクラスです。


※参考URL : http://d.hatena.ne.jp/ura_ra/20111026/1319642014

このようなNNを組んでみま す。

class Model(Chain):      def __init__(self):          super(Model, self).__init__(              l1 = L.Linear(2, 3)              l2 = L.Linear(3, 1)          )  

順伝播

__call__関数に、順伝 播の計算を定義します。

class Model(Chain):      def __init__(self):          super(Model, self).__init__(              l1 = L.Linear(2, 3)              l2 = L.Linear(3, 1)          )      def __call__(self, x, y):          h1 = F.relu(self.l1(x))          return self.l2(h1)  

F.relu()は正規化線形 関数(Rectified Linear Unit function)といいます。
relu関数は単純なためsigmoid関数やtanh関数よりも計算が早いです。
[relu関数]

Optimizer の定義

Optimizerというのは、数 値最適化アルゴリズムのこと。
パラメーターの勾配の配列をあらかじめsetupメソッドに渡しておく必要があります。

① モデルを生成
② 最適化アルゴリズムの選択
③ アルゴリズムにモデルをセット

model = L.Classifier(Model())  optimizer = chainer.optimizers.Adam()  optimizer.setup(model)  

chainer.optimizersについて

最適化アルゴリズムは以下のも のが実装されている。

  • SGD
  • MomentumSGD
  • AdaGrad
  • RMSprop
  • RMSpropGraves
  • AdaDelta
  • Adam

Adamという手法が最近では よく使用される。
どうやら、計算スピードが早く、比較的良い精度になるらしい(アルゴリズムは理解してない...)

バージョ ン1.11.0からの新機能

「trainer」の登場で、コー ドがだいぶ抽象化され、書きやすくなりました!

train_iter = chainer.iterators.SerialIterator(train, 100)  test_iter = chainer.iterators.SerialIterator(test, 100,repeat=False, shuffle=False)    updater = training.StandardUpdater(train_iter, optimizer, device=-1)  trainer = training.Trainer(updater, (100, 'epoch'), out="result")  

chainer.iterators.SerialIteratorについて

chainer.iterators.SerialIterator(dataset, batch_size, repeat=True, shuffle=True)  

パラメーター解説

  • dataset
    • イテレー ションするデータセット
  • batch_size [int]
    • バッチサイ ズ
  • repeat [boolean]
    • 繰り返しな し(エポック数1、主にテスト用)か繰り返しあり(エポック数1以上、主に訓練用)か
  • shuffle [boolean]
    • データを シャッフルしない(主に時系列データ用)か、シャッフルするか

Iterator examples — Chainer 1.21.0 documentation

training.StandardUpdaterについて

chainer.training.StandardUpdater(iterator, optimizer, converter=<function concat_examples>, device=None, loss_func=None)  

パラメーター解説

  • iterator
    • 学習対象の イテレーターです。複数のイテレーターを辞書型で指定することができます。
  • optimizer
    • 最適化手 法。
  • converter
    • iterator に辞書型で複数のイテレーターを入力したときに、結合に使う関数を指定します。
  • device
    • 0だったら GPU、-1だったらCPUを使用して計算します。
  • loss_func
    • 誤差関数。 通常はoptimizerがセットアップしたリンクを指定するので、サンプルコードのように下準備を済ませておけば Noneで問題ないです。

Training loop abstraction — Chainer 1.21.0 documentation

chainer.training.Trainerについて

chainer.training.Trainer(updater, stop_trigger=None, out='result')  

パラメーター解説

  • updater
    • 使用する updaterを指定します。(updater)
  • stop_trigger
    • エポック数 やイテレーション数などを(1000, 'iteration')や(1, 'epoch')のように指定します。(tuple)
  • out
    • 出力先を指 定します。(str)

Extension 機能

実行中に学習経過を見るための関数 が用意されている。

trainer.extend(extensions.Evaluator(test_iter, model, device=-1))  trainer.extend(extensions.LogReport())  trainer.extend(extensions.PrintReport( ['epoch', 'main/loss', 'validation/main/loss', 'main/accuracy', 'validation/main/accuracy']))  trainer.extend(extensions.ProgressBar())  

↓ こんな感じに、途中経過が見れ る

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  1           0.333247    0.163566              0.90525        0.951  2           0.13979     0.120721              0.95835        0.9645  3           0.0972047   0.10129               0.970817       0.9682  4           0.0724406   0.0958347             0.9781         0.9712  5           0.05642     0.0935157             0.983267       0.9707  6           0.0443315   0.0999502             0.987183       0.9684       total [##############################....................] 60.00%  this epoch [..................................................]  0.00%        3600 iter, 6 epoch / 10 epochs  

詳しくは、このリンクに詳しく書い てある。
Trainer extensions — Chainer 1.21.0 documentation

あとで、記事にまとめる予定。


学習済み モデルの保存

学習をしていい結果が出たモデルは 保存しておく。
modelを"my.model"という名前で保存する。

serializers.save_npz('my.model', model)  

保存されたモデルは以下のように呼 び出す。

serializers.load_npz('my.model', model)  

Optimizerの状態も保存で きる。

serializers.save_npz('my.state', optimizer)  serializers.load_npz('my.state', optimizer)

0 件のコメント:

コメントを投稿