この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
chainer2プログラミングの全体図 [2017/11/02] adash333 [参考文献] |
chainer2プログラミングの全体図 [2018/10/07] (現在) |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
===== Chainerプログラミングの全体図 ===== | ===== Chainerプログラミングの全体図 ===== | ||
+ | <wrap hi>Chainer2でMNIST目次</wrap>\\ | ||
[[Chainer2プログラミングの全体図]] | [[Chainer2プログラミングの全体図]] | ||
-[[(1)Chainer2を使用するためのimport文]] | -[[(1)Chainer2を使用するためのimport文]] | ||
ライン 11: | ライン 12: | ||
- | 必ずしもこの書き方ではなくてもよいらしい。。。 | + | あくまで一例として記載させていただきます。 |
- | 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に自分の手でコードを写経して実行していくのがお勧めです。 |
- | ●Chainerプログラミングの流れ | + | ●Chainer2プログラミングの流れ |
<code> | <code> | ||
ライン 41: | ライン 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, ...): | ||
# モデルを記載 | # モデルを記載 | ||
ライン 50: | ライン 52: | ||
(4)#4 モデルと最適化アルゴリズムの設定 | (4)#4 モデルと最適化アルゴリズムの設定 | ||
model = MyModel() | model = MyModel() | ||
+ | model = L.Classifier(model) | ||
optimizer = optimizers.Adam() | optimizer = optimizers.Adam() | ||
optimizer.setup(model) | optimizer.setup(model) | ||
+ | (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) | ||
- | |||
- | (5)#5 学習と結果の出力 | ||
# TrainerにUpdaterを渡す | # TrainerにUpdaterを渡す | ||
trainer = training.Trainer(updater, (max_epoch, 'epoch'), out='mnist_result') | trainer = training.Trainer(updater, (max_epoch, 'epoch'), out='mnist_result') | ||
ライン 64: | ライン 65: | ||
from chainer.training import extensions | from chainer.training import extensions | ||
# trainer.extend()で、学習の進行状況を表すプログレスバーや、lossのグラフ化と画像の保存などを行う | # trainer.extend()で、学習の進行状況を表すプログレスバーや、lossのグラフ化と画像の保存などを行う | ||
+ | # 学習を実行 | ||
trainer.run() | trainer.run() | ||
ライン 75: | ライン 76: | ||
import numpy as np | import numpy as np | ||
import chainer import serializers | import chainer import serializers | ||
- | |||
# Network definition | # Network definition | ||
# train.py と同じModelを定義 | # train.py と同じModelを定義 | ||
- | |||
# modelをClassifier化し、train.pyでの学習結果のパラメータをloadする | # modelをClassifier化し、train.pyでの学習結果のパラメータをloadする | ||
model = L.Classifier(MLP(1000, 10)) | model = L.Classifier(MLP(1000, 10)) | ||
ライン 106: | ライン 105: | ||
| | ||
- | ===== Chainerプログラミングの全体図(2)Trainerを利用する場合 ===== | ||
- | |||
- | Trainerについては、以下のスライドが非常に参考になります。(といっても、私にはスライド内容の5%くらいしか理解できていない気がします、、、) | ||
- | |||
- | Chainer の Trainer 解説と NStepLSTM について | ||
- | Published on Apr 11, 2017\\ | ||
- | https://www.slideshare.net/Retrieva_jp/chainer-trainer-nsteplstm | ||
- | |||
- | ==== Trainerを利用する場合のChainer全体図 ==== | ||
- | 「Trainerを利用する場合の全体図」 | ||
- | (参考:Chainer v2による実践深層学習 新納浩幸 p54) | ||
- | |||
- | |||
- | <code> | ||
- | # train.py | ||
- | (1)#1 Chainerを使用するためのimport文 | ||
- | |||
- | (2)#2 tuple_datasetによるデータの準備・設定 | ||
- | |||
- | (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 | ||
ライン 168: | ライン 125: | ||
</html> | </html> | ||
+ | 次のページから、上記コードについて順番に解説していきます。 | ||
次 [[(1)Chainer2を使用するためのimport文]] | 次 [[(1)Chainer2を使用するためのimport文]] | ||
ライン 206: | ライン 163: | ||
前 [[Chainer2.0をWindowsにインストール]] | 前 [[Chainer2.0をWindowsにインストール]] | ||
- | 目次 | + | |
+ | <wrap hi>Chainer2でMNIST目次</wrap>\\ | ||
[[Chainer2プログラミングの全体図]] | [[Chainer2プログラミングの全体図]] | ||
-[[(1)Chainer2を使用するためのimport文]] | -[[(1)Chainer2を使用するためのimport文]] | ||
ライン 215: | ライン 173: | ||
-[[(6)結果の出力|(6)学習結果のパラメータの保存(Chainer)]] | -[[(6)結果の出力|(6)学習結果のパラメータの保存(Chainer)]] | ||
-[[(7)推測|(7)推測(Chainer)]] | -[[(7)推測|(7)推測(Chainer)]] | ||
+ | |||
+ |