この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
chainer2プログラミングの全体図 [2017/11/01] adash333 [参考文献] |
chainer2プログラミングの全体図 [2018/10/07] (現在) |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
- | ===== Chainerプログラミングの全体図(1)Trainerを利用しない場合 ===== | + | ===== Chainerプログラミングの全体図 ===== |
- | 必ずしもこの書き方ではなくてもよいらしい。。。 | + | <wrap hi>Chainer2でMNIST目次</wrap>\\ |
+ | [[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全体図 ==== | ||
- | WEB上のMNISTのサンプルコードを読んでいると、Kerasだと皆ほぼ同じコードになるのに、Chainerだと人によってコードが結構異なる感じで、初心者には本当にとっつきにくいイメージ。 | + | Trainerとは、Chainerで学習を行う際に使用すると便利なChainerのモジュールです。 |
- | Chainer 1.11.0から、Trainerというものが導入されたらしく、このサイトでは、Trainerを用いた記載方法のみ解説します。(筆者がTrainerを使用しないやり方を実行できなかったため。) | + | いきなりTrainerと言われてもさっぱりだと思いますが、コードをコピペして1個ずつ理解するのみです! |
- | ==== Trainerを利用しない場合のChainer全体図 ==== | + | Trainerの構造は、以下のようになっているらしいです。\\ |
+ | (出典:[[https://qiita.com/mitmul/items/eccf4e0a84cb784ba84a|Chainerビギナー向けチュートリアル Vol.1]] | ||
+ | ) | ||
+ | {{:pasted:20171102-203705.png}} | ||
- | https://books.google.co.jp/books?id=n342DwAAQBAJ&pg=PA42&lpg=PA42&dq=chainer+%E5%85%A8%E4%BD%93%E5%9B%B3&source=bl&ots=1ybBZW8I4N&sig=X7mUk9h3Ib7P6uk7uKv5F90l-vM&hl=ja&sa=X&ved=0ahUKEwjQo5u1rfrWAhUFI5QKHSJaB5kQ6AEINTAC#v=onepage&q=chainer%20%E5%85%A8%E4%BD%93%E5%9B%B3&f=false | + | 私も最初にこの図を見たときは何がなんだかさっぱり分かりませんでしたが、この図をみながら、なんとなく、以下の全体図にざっと目を通して下さい。以後、具体的なコードを勉強するときに、『いま、全体図の中でどこのコードを書いているのか?』を把握しながら、Jupyter Notebookに自分の手でコードを写経して実行していくのがお勧めです。 |
+ | ●Chainer2プログラミングの流れ | ||
<code> | <code> | ||
+ | # ---------- train.py ---------- # | ||
(1)#1 Chainerを使用するためのimport文 | (1)#1 Chainerを使用するためのimport文 | ||
(2)#2 データの準備・設定 | (2)#2 データの準備・設定 | ||
+ | from chainer import iterators | ||
+ | # trainerを利用するために、Iteratorを定義してdatasetにアクセスできるようにする | ||
(3)#3 モデルの記述 | (3)#3 モデルの記述 | ||
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 学習(Trainerを利用しない場合) | + | (5)#5 学習と結果の出力 |
- | for epoch in range(繰り返し回数) | + | # UpdaterにIteratorとOptimizerを渡す |
- | データの加工 | + | from chainer import training |
- | model.cleargrads() #勾配初期化 | + | updater = training.StandardUpdater(train_iter, optimizer, device=gpu_id) |
- | loss = model(...) #誤差計算 | + | # TrainerにUpdaterを渡す |
- | loss.backward #勾配計算 | + | trainer = training.Trainer(updater, (max_epoch, 'epoch'), out='mnist_result') |
- | optimizer.update #パラメータ更新 | + | # TrainerにExtensionを追加 |
+ | from chainer.training import extensions | ||
+ | # trainer.extend()で、学習の進行状況を表すプログレスバーや、lossのグラフ化と画像の保存などを行う | ||
+ | # 学習を実行 | ||
+ | trainer.run() | ||
- | (6)#6 結果の出力 | + | (6)#6 学習結果のパラメータの保存 |
- | </code> | + | # Save paramaters |
+ | chainer.serializers.save_npz('my_mnist.model', model) | ||
- | ===== Chainerプログラミングの全体図(2)Trainerを利用する場合 ===== | + | # ---------- 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) | ||
- | Trainerについては、以下のスライドが非常に参考になります。(といっても、私にはスライド内容の5%くらいしか理解できていない気がします、、、) | + | # 推測したい画像を読みこんでNumpy配列に変換し、chainerのVariableに変換 |
- | + | # (詳細は後述) | |
- | Chainer の Trainer 解説と NStepLSTM について | + | x = chainer.Variable(image) |
- | Published on Apr 11, 2017\\ | + | # chainer.links.Classifierのpredictorで推測 |
- | https://www.slideshare.net/Retrieva_jp/chainer-trainer-nsteplstm | + | y = model.predictor(x) |
- | + | predict = np.argmax(y.data) | |
- | ==== 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): | + | ==== Chainer2でMNISTのコード ==== |
- | # モデルを記述 | + | 以下にコードそのものを記載します。非常に長く取っつきにくいコードですが、次回以降、順に解説させていただきます。 |
- | (4)#4 モデルと最適化アルゴリズムの設定(ほぼお約束の3行) | + | なお、今回はMNISTのデータセットを、Chainerがあらかじめ用意したものを使って学習を行いますが、画像データからChainer用データセットに変換する方法については、[[Chainer2用自前データの準備]]をご覧下さい。(かなりややこしいので、最初は、以下のコードを写経してから、自前データの準備に進むのがお勧めです。) |
- | 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のコード ==== | + | |
- | 以下にコードそのものを記載します。次回以降、順に解説させていただきます。 | + | |
train_mnist_mlp.py | train_mnist_mlp.py | ||
ライン 106: | ライン 125: | ||
</html> | </html> | ||
+ | 次のページから、上記コードについて順番に解説していきます。 | ||
- | + | 次 [[(1)Chainer2を使用するためのimport文]] | |
===== 参考文献 ===== | ===== 参考文献 ===== | ||
ライン 125: | ライン 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 | ||
===== 次節以降 ===== | ===== 次節以降 ===== | ||
ライン 138: | ライン 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で公開]] | + |