基本ライ ブラリのインポート
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]
- データを シャッフルしない(主に時系列データ用)か、シャッフルするか
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で問題ないです。
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 件のコメント:
コメントを投稿