この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
| 
                    chainer2プログラミングの全体図 [2017/11/02] adash333 [Trainerを利用する場合のChainer全体図]  | 
                
                    chainer2プログラミングの全体図 [2018/10/07] (現在) | 
            ||
|---|---|---|---|
| ライン 1: | ライン 1: | ||
| ===== Chainerプログラミングの全体図 ===== | ===== Chainerプログラミングの全体図 ===== | ||
| + | <wrap hi>Chainer2でMNIST目次</wrap>\\ | ||
| [[Chainer2プログラミングの全体図]] | [[Chainer2プログラミングの全体図]] | ||
| -[[(1)Chainer2を使用するためのimport文]] | -[[(1)Chainer2を使用するためのimport文]] | ||
| ライン 6: | ライン 7: | ||
| -[[(3)モデルの記述|(3)モデルの記述(Chainer)]] | -[[(3)モデルの記述|(3)モデルの記述(Chainer)]] | ||
| -[[(4)モデルと最適化アルゴリズムの設定|(4)モデルと最適化アルゴリズムの設定(Chainer)]] | -[[(4)モデルと最適化アルゴリズムの設定|(4)モデルと最適化アルゴリズムの設定(Chainer)]] | ||
| - | -[[(5)学習(Chainer)]] | + | -[[(5)学習と結果の出力(Chainer)]] | 
| - | -[[(6)結果の出力|(6)結果の出力(Chainer)]] | + | -[[(6)結果の出力|(6)学習結果のパラメータの保存(Chainer)]] | 
| -[[(7)推測|(7)推測(Chainer)]] | -[[(7)推測|(7)推測(Chainer)]] | ||
| - | 必ずしもこの書き方ではなくてもよいらしい。。。 | + | あくまで一例として記載させていただきます。 | 
| - | WEB上のMNISTのサンプルコードを読んでいると、Kerasだと皆ほぼ同じコードになるのに、Chainerだと人によってコードが結構異なる感じで、初心者には本当にとっつきにくいイメージ。 | + | WEB上のMNISTのサンプルコードを読んでいると、Kerasだと皆ほぼ同じコードになるのに、Chainerだと人によってコードが結構異なる感じで、初心者には本当にとっつきにくいイメージでした。 | 
| - | Chainer 1.11.0から、Trainerというものが導入されたらしく、このサイトでは、Trainerを用いた記載方法のみ解説します。(筆者がTrainerを使用しないやり方を実行できなかったため。) | + | Chainer 1.11.0から、Trainerというものが導入されたらしく、このサイトでは、Trainerを用いた記載方法のみ解説します。最初はIteratorとか意味不明な言葉が出てきて混乱しやすいですが、我慢して、Iterator、Dataset、Optimizer、Model、Updater、Extensionsを勉強していくしかありません。(Trainerを使用しないプログラミングができるレベルの人は、Trainerを理解してさっさと使われるのだと思われます。) | 
| ==== Trainerを利用する場合のChainer全体図 ==== | ==== Trainerを利用する場合のChainer全体図 ==== | ||
| + | |||
| + | Trainerとは、Chainerで学習を行う際に使用すると便利なChainerのモジュールです。 | ||
| いきなりTrainerと言われてもさっぱりだと思いますが、コードをコピペして1個ずつ理解するのみです! | いきなりTrainerと言われてもさっぱりだと思いますが、コードをコピペして1個ずつ理解するのみです! | ||
| ライン 26: | ライン 29: | ||
| {{:pasted:20171102-203705.png}} | {{:pasted:20171102-203705.png}} | ||
| - | 最初にこの図を見たときは何がなんだかさっぱりでしたが、この図をみながら、なんとなく、以下のコードを写経して勉強していきたいと思います。 | + | 私も最初にこの図を見たときは何がなんだかさっぱり分かりませんでしたが、この図をみながら、なんとなく、以下の全体図にざっと目を通して下さい。以後、具体的なコードを勉強するときに、『いま、全体図の中でどこのコードを書いているのか?』を把握しながら、Jupyter Notebookに自分の手でコードを写経して実行していくのがお勧めです。 | 
| + | |||
| + | ●Chainer2プログラミングの流れ | ||
| <code> | <code> | ||
| + | # ---------- train.py ---------- # | ||
| (1)#1 Chainerを使用するためのimport文 | (1)#1 Chainerを使用するためのimport文 | ||
| ライン 38: | ライン 44: | ||
| class MyModel(Chain): | class MyModel(Chain): | ||
| def __init__(self): | def __init__(self): | ||
| - | super(MyModel,self).__init__( | + | super(MyModel,self).__init__( | 
| # パラメータを含む関数の宣言 | # パラメータを含む関数の宣言 | ||
| ) | ) | ||
| - |  | ||
| def __call__(self, ...): | def __call__(self, ...): | ||
| # モデルを記載 | # モデルを記載 | ||
| - | (4)#4 モデルと最適化アルゴリズムの設定(ほぼお約束の3行) | + | (4)#4 モデルと最適化アルゴリズムの設定 | 
| model = MyModel() | model = MyModel() | ||
| + | model = L.Classifier(model) | ||
| optimizer = optimizers.Adam() | optimizer = optimizers.Adam() | ||
| optimizer.setup(model) | optimizer.setup(model) | ||
| - | (5)#5 学習 | + | (5)#5 学習と結果の出力 | 
| # UpdaterにIteratorとOptimizerを渡す | # UpdaterにIteratorとOptimizerを渡す | ||
| from chainer import training | from chainer import training | ||
| - | |||
| updater = training.StandardUpdater(train_iter, optimizer, device=gpu_id) | 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 結果の出力とパラメータの保存 | + | (6)#6 学習結果のパラメータの保存 | 
| + | # Save paramaters | ||
| + | chainer.serializers.save_npz('my_mnist.model', model) | ||
| - | (7) | + | # ---------- predict.py ---------- # | 
| - | </code> | + | (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) | ||
| - | ===== Chainerプログラミングの全体図(2)Trainerを利用する場合 ===== | + | # 推測したい画像を読みこんでNumpy配列に変換し、chainerのVariableに変換 | 
| - | + | # (詳細は後述) | |
| - | Trainerについては、以下のスライドが非常に参考になります。(といっても、私にはスライド内容の5%くらいしか理解できていない気がします、、、) | + | x = chainer.Variable(image) | 
| - | + | # chainer.links.Classifierのpredictorで推測 | |
| - | Chainer の Trainer 解説と NStepLSTM について | + | y = model.predictor(x) | 
| - | Published on Apr 11, 2017\\ | + | predict = np.argmax(y.data) | 
| - | https://www.slideshare.net/Retrieva_jp/chainer-trainer-nsteplstm | + | |
| - | + | ||
| - | ==== Trainerを利用する場合のChainer全体図 ==== | + | |
| - | 「Trainerを利用する場合の全体図」 | + | |
| - | (参考:Chainer v2による実践深層学習 新納浩幸 p54) | + | |
| + | print("predict:" , predict) | ||
| + | </code> | ||
| + | もう一度、Trainerの構造を、今度はテキストで記載。 | ||
| <code> | <code> | ||
| - | # train.py | + | Trainer | 
| - | (1)#1 Chainerを使用するためのimport文 | + | |-Updater | 
| + | |-Iterator | ||
| + | |-Dataset | ||
| + | |-Optimizer | ||
| + | |-Model | ||
| + | |-Extensions  | ||
| - | (2)#2 tuple_datasetによるデータの準備・設定 | + | </code> | 
| + |  | ||
| - | (3)#3 モデルの記述 | ||
| - | class MyModel(Chain): | ||
| - | def __init__(self): | ||
| - | super(MyModel, self).__init__( | ||
| - | # パラメータを含む関数の宣言 | ||
| - | ) | ||
| - | |||
| - | def __call__(self, x,t): | ||
| - | # モデルを記述 | ||
| - | |||
| - | (4)#4 モデルと最適化アルゴリズムの設定(ほぼお約束の3行) | ||
| - | model = MyModel() | ||
| - | optimizer = optimizers.Adam() | ||
| - | optimizer.setup(model) | ||
| - | |||
| - | (5)#5 学習(Trainerを利用する場合) | ||
| - | iterator = iterators.SerialIterator(tdata, bsize) | ||
| - | updater = training.StandardUpdater(iterator, optimizer) | ||
| - | trainer = training.Trainer(updater, (ep, ‘epoch’)) | ||
| - | trainer.extend(extensions.ProgressBar()) | ||
| - | |||
| - | trainer.run() | ||
| - | |||
| - | (6)#6 結果の出力 | ||
| - | </code> | ||
| ==== Chainer2でMNISTのコード ==== | ==== Chainer2でMNISTのコード ==== | ||
| 以下にコードそのものを記載します。非常に長く取っつきにくいコードですが、次回以降、順に解説させていただきます。 | 以下にコードそのものを記載します。非常に長く取っつきにくいコードですが、次回以降、順に解説させていただきます。 | ||
| + | |||
| + | なお、今回はMNISTのデータセットを、Chainerがあらかじめ用意したものを使って学習を行いますが、画像データからChainer用データセットに変換する方法については、[[Chainer2用自前データの準備]]をご覧下さい。(かなりややこしいので、最初は、以下のコードを写経してから、自前データの準備に進むのがお勧めです。) | ||
| train_mnist_mlp.py | train_mnist_mlp.py | ||
| ライン 123: | ライン 125: | ||
| </html> | </html> | ||
| + | 次のページから、上記コードについて順番に解説していきます。 | ||
| 次 [[(1)Chainer2を使用するためのimport文]] | 次 [[(1)Chainer2を使用するためのimport文]] | ||
| ライン 142: | ライン 144: | ||
| Chainerの基本的な使い方\\ | Chainerの基本的な使い方\\ | ||
| https://github.com/dsanno/deep-learning-study/blob/master/doc/chainer_basic.md | 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 | ||
| ===== 次節以降 ===== | ===== 次節以降 ===== | ||
| ライン 155: | ライン 163: | ||
| 前 [[Chainer2.0をWindowsにインストール]] | 前 [[Chainer2.0をWindowsにインストール]] | ||
| - | 目次 | + | |
| - | -[[Chainer2.0をWindowsにインストール]] | + | <wrap hi>Chainer2でMNIST目次</wrap>\\ | 
| - | -[[Chainer2プログラミングの全体図]] | + | [[Chainer2プログラミングの全体図]] | 
| -[[(1)Chainer2を使用するためのimport文]] | -[[(1)Chainer2を使用するためのimport文]] | ||
| - | -[[(2)データの準備・設定]] | + | -[[(2)データの準備・設定|(2)データの準備・設定(Chainer)]] | 
| - | -[[(3)モデルの記述]] | + | -[[(3)モデルの記述|(3)モデルの記述(Chainer)]] | 
| - | -[[(4)モデルと最適化アルゴリズムの設定]] | + | -[[(4)モデルと最適化アルゴリズムの設定|(4)モデルと最適化アルゴリズムの設定(Chainer)]] | 
| - | -[[(5)学習(Trainerを利用しない場合)]] | + | -[[(5)学習と結果の出力(Chainer)]] | 
| - | -[[(6)結果の出力]] | + | -[[(6)結果の出力|(6)学習結果のパラメータの保存(Chainer)]] | 
| - | -[[(7)推測]] | + | -[[(7)推測|(7)推測(Chainer)]] | 
| - | -[[Chainer2機械学習成果をWEBで公開]] | + | |