===== Chainerプログラミングの全体図 ===== Chainer2でMNIST目次\\ [[Chainer2プログラミングの全体図]] -[[(1)Chainer2を使用するためのimport文]] -[[(2)データの準備・設定|(2)データの準備・設定(Chainer)]] -[[(3)モデルの記述|(3)モデルの記述(Chainer)]] -[[(4)モデルと最適化アルゴリズムの設定|(4)モデルと最適化アルゴリズムの設定(Chainer)]] -[[(5)学習と結果の出力(Chainer)]] -[[(6)結果の出力|(6)学習結果のパラメータの保存(Chainer)]] -[[(7)推測|(7)推測(Chainer)]] あくまで一例として記載させていただきます。 WEB上のMNISTのサンプルコードを読んでいると、Kerasだと皆ほぼ同じコードになるのに、Chainerだと人によってコードが結構異なる感じで、初心者には本当にとっつきにくいイメージでした。 Chainer 1.11.0から、Trainerというものが導入されたらしく、このサイトでは、Trainerを用いた記載方法のみ解説します。最初はIteratorとか意味不明な言葉が出てきて混乱しやすいですが、我慢して、Iterator、Dataset、Optimizer、Model、Updater、Extensionsを勉強していくしかありません。(Trainerを使用しないプログラミングができるレベルの人は、Trainerを理解してさっさと使われるのだと思われます。) ==== Trainerを利用する場合のChainer全体図 ==== Trainerとは、Chainerで学習を行う際に使用すると便利なChainerのモジュールです。 いきなりTrainerと言われてもさっぱりだと思いますが、コードをコピペして1個ずつ理解するのみです! Trainerの構造は、以下のようになっているらしいです。\\ (出典:[[https://qiita.com/mitmul/items/eccf4e0a84cb784ba84a|Chainerビギナー向けチュートリアル Vol.1]] ) {{:pasted:20171102-203705.png}} 私も最初にこの図を見たときは何がなんだかさっぱり分かりませんでしたが、この図をみながら、なんとなく、以下の全体図にざっと目を通して下さい。以後、具体的なコードを勉強するときに、『いま、全体図の中でどこのコードを書いているのか?』を把握しながら、Jupyter Notebookに自分の手でコードを写経して実行していくのがお勧めです。 ●Chainer2プログラミングの流れ # ---------- train.py ---------- # (1)#1 Chainerを使用するためのimport文 (2)#2 データの準備・設定 from chainer import iterators # trainerを利用するために、Iteratorを定義してdatasetにアクセスできるようにする (3)#3 モデルの記述 class MyModel(Chain): def __init__(self): super(MyModel,self).__init__( # パラメータを含む関数の宣言 ) def __call__(self, ...): # モデルを記載 (4)#4 モデルと最適化アルゴリズムの設定 model = MyModel() model = L.Classifier(model) optimizer = optimizers.Adam() optimizer.setup(model) (5)#5 学習と結果の出力 # UpdaterにIteratorとOptimizerを渡す from chainer import training updater = training.StandardUpdater(train_iter, optimizer, device=gpu_id) # TrainerにUpdaterを渡す trainer = training.Trainer(updater, (max_epoch, 'epoch'), out='mnist_result') # TrainerにExtensionを追加 from chainer.training import extensions # trainer.extend()で、学習の進行状況を表すプログレスバーや、lossのグラフ化と画像の保存などを行う # 学習を実行 trainer.run() (6)#6 学習結果のパラメータの保存 # Save paramaters chainer.serializers.save_npz('my_mnist.model', model) # ---------- predict.py ---------- # (7)#7 推測 import numpy as np import chainer import serializers # Network definition # train.py と同じModelを定義 # modelをClassifier化し、train.pyでの学習結果のパラメータをloadする model = L.Classifier(MLP(1000, 10)) serializers.load_npz('my_mnist.model' model) # 推測したい画像を読みこんでNumpy配列に変換し、chainerのVariableに変換 # (詳細は後述) x = chainer.Variable(image) # chainer.links.Classifierのpredictorで推測 y = model.predictor(x) predict = np.argmax(y.data) print("predict:" , predict) もう一度、Trainerの構造を、今度はテキストで記載。 Trainer |-Updater |-Iterator |-Dataset |-Optimizer |-Model |-Extensions ==== Chainer2でMNISTのコード ==== 以下にコードそのものを記載します。非常に長く取っつきにくいコードですが、次回以降、順に解説させていただきます。 なお、今回はMNISTのデータセットを、Chainerがあらかじめ用意したものを使って学習を行いますが、画像データからChainer用データセットに変換する方法については、[[Chainer2用自前データの準備]]をご覧下さい。(かなりややこしいので、最初は、以下のコードを写経してから、自前データの準備に進むのがお勧めです。) train_mnist_mlp.py Predict_mnist_mlp.py 次のページから、上記コードについて順番に解説していきます。 次 [[(1)Chainer2を使用するためのimport文]] ===== 参考文献 ===== https://qiita.com/abechi_17/items/b271b7042fae126616d7\\ Chainer 2.0 のMNISTサンプルで推論を動かす abechi_17 2017年07月01日に投稿 Chainer 2.0 のMNISTサンプル(公式Document) https://github.com/chainer/chainer/tree/v2.0.0/examples/mnist Chainerの基本的な使い方\\ https://github.com/dsanno/deep-learning-study/blob/master/doc/chainer_basic.md Trainerについては、以下のスライドが非常に参考になります。(といっても、私にはスライド内容の5%くらいしか理解できていない気がします、、、) Chainer の Trainer 解説と NStepLSTM について Published on Apr 11, 2017\\ https://www.slideshare.net/Retrieva_jp/chainer-trainer-nsteplstm ===== 次節以降 ===== MNISTを例に、一つずつ解説させていただきたいと思います。 いつもあまり面白くないMNISTですが、Chainer2プログラミングを理解する上で避けて通れないので、頑張ってやってみたいと思います。 ===== リンク ===== 次 [[(1)Chainer2を使用するためのimport文]] 前 [[Chainer2.0をWindowsにインストール]] Chainer2でMNIST目次\\ [[Chainer2プログラミングの全体図]] -[[(1)Chainer2を使用するためのimport文]] -[[(2)データの準備・設定|(2)データの準備・設定(Chainer)]] -[[(3)モデルの記述|(3)モデルの記述(Chainer)]] -[[(4)モデルと最適化アルゴリズムの設定|(4)モデルと最適化アルゴリズムの設定(Chainer)]] -[[(5)学習と結果の出力(Chainer)]] -[[(6)結果の出力|(6)学習結果のパラメータの保存(Chainer)]] -[[(7)推測|(7)推測(Chainer)]]