Chainer2のMNIST_MLPコードの解読にtryしてみる

本当は、画像ファイルからデータセットの作成も行いたいが、そこまで余裕がないので、まずは、以下の公式GitHubのMNIST_MLPのコードを改変したものの解読にtryしてみる。

https://github.com/mitmul/chainer-handson/blob/master/2-Try-Trainer-class_ja.ipynb
image

(今回のコード)

https://gist.github.com/adash333/87c4329891613d0b39563a63fe711c8b

(環境)
Panasonic CF-RZ4
Windows 8.1 Pro
Anaconda 4.4.0
Python 3.5
PHP 5.6.23

Chainer2.0は以下のようにインストールし、再開時は、activate chainer2で仮想環境を起動。

Windows8.1にChainer2.0をインストール
Chainerの本が、Version2に対応したみたいなので、以下の本を衝動買い! (あとで、2017/10/18時点で、Chainerは...

(0)Chainerプログラミングの流れ
(Trainerを用いる場合:初心者にはこれがお勧めと思われる)

ChainerにはTrainerというモジュールがあり、基本的にこれを用いて学習を行う。
Trainerの構造は、以下の図の通りだが、Trainerが使用できるように、

1.Updater
2.Iterator
3.Dataset
4.Optimizer
5.Model
6.Extensions

を記載していく必要がある。
上記を記載した後に、trainer.run() で学習を実行する。

trainer

出典:https://qiita.com/mitmul/items/eccf4e0a84cb784ba84a

(1)jupyter notebookを起動し、New > Python3 を行い、以下のサイトのコードを順番に入力していく

https://github.com/mitmul/chainer-handson/blob/master/2-Try-Trainer-class_ja.ipynb

image

#1 datasetの準備

(2)#2 Iteratorの準備

# ChainerにはTrainerというモジュールがあり、基本的にこれを用いて学習を行う。
# Trainerの構造は、以下の図の通りだが、Trainerが使用できるように、順番に、
# Updater, Iterator, Dataset, Optimizer, Model, Extensions
# を記載していく必要がある。
# 上記を記載した後に、trainer.run() で学習を実行する。
# Trainerの構造の図のリンク(絶対に閲覧お勧めの図)

trainer

上記の出典はこちら

image

(3) #3 Modelの準備

# ChainerのTrainerを使用するために、Modelを準備する
# LinkとFunction

Chainerでは、ニューラルネットワークの各層を、LinkとFunctionに区別します。
Linkは、パラメータを持つ関数です。
Functionは、パラメータを持たない関数です。
これらを組み合わせてモデルを記述します。

今回は、手書き数字MNIST画像を、multiple layer perceptron(多層パーセプトロン)という
ニューラルネットワークモデルを用いて機械学習で分類します。
層構造のイメージは、以下のリンクが参考になります。
https://qiita.com/kenmatsu4/items/7b8d24d4c5144a686412
ネットワークは3層で、入力層、隠れ層、出力層の3層とします。
28×28のグレースケール画像を、0から255までの値をとる各ピクセルの値を、
784個、横に並んだ数字の配列に変換して(、さらに255で割って)、
入力層に入れます。入力層のunit数は784個となります。
中間層のunit数(n_mid_units)は、今回は、100個に設定しています。
手書き数字の0から9まで10種類の画像を分類するため、
出力層のunit数(n_out)は、10個となります。

image

image

(4) #4 Updaterの準備

以下のコードをコピペ

image

(5)#5 学習と結果の出力
# TrainerにUpdaterを渡す
trainer = training.Trainer(updater, (max_epoch, ‘epoch’), out=’mnist_result’)
# TrainerにExtensionを追加
from chainer.training import extensions
    # trainer.extend()で、学習の進行状況を表すプログレスバーや、lossのグラフ化と画像の保存などを行う

trainer.run()

以下のコードをコピペ。

image

すると、MNIST tutorial.ipynb と同じフォルダに mnist_result フォルダが作成され、中身がいろいろ保存される。詳細は私にはわかりません。

image

image

(6)学習結果のパラメータの保存

以下のコードをコピペ。

image

すると、MNIST tutorial(train).ipynb と同じフォルダに、my_mnist.model ファイルが保存される。

image

(7)推測

MNIST tutorial(train).ipynb と同じ階層で、New > Python3 で新規ipynbファイルを作成し、MNIST tutorial(predict).ipynb  という名前に変更

image

以下のコードをコピペ

image

image

(8)自分で作った画像を推測してみる

Windowsのペイントで、黒の背景に、白で、以下のように記載して、test.pngとして保存。

image

image

predict.py の、

# filepath は適当に変更。今回は、chainer_MNIST_MLP_predict.pyと同じ階層に、0.jpgを保存しておき、推測する。
filepath = “0.jpg”

を、

filepath = “test.png”

に変更して保存して、実行。

image

残念、8のつもりが、3と判定されてしまった。

image

image

image

まあまあ大丈夫そう。

(9)上記コードの全文。なお、Jupyter Notebookではなく、Anaconda Prompt上からも実行可能。

image

train_jupyter.py

predict_jupyter.py

(10)本当は、

ではなく、自分でjpg画像の集まりから、Chainer用のデータセットを作って機械学習したい。。。

統計でもなんでも、手持ちのデータセットを、コンピュータが理解できる形に整形するのが一番難しい。

今のところは、以下の参考リンクのみにとどめるが、いつかちゃんと記載したい。

MNISTデータ→png画像→(一部を)Chainer用データセット→training→predict1(1)(挫折、、、)
今までの復習。まとめてみる。 本来、MNISTとは手書き数字の28x28ピクセルのグレースケール画像のセットであるが、KerasやCh...

(参考)

Chainer: ビギナー向けチュートリアル Volmitmul
2017年05月18日に更新
https://qiita.com/mitmul/items/eccf4e0a84cb784ba84a

Chainerチュートリアル の和訳【Chainerの紹介と多層パーセプトロン】20160120
http://www.iandprogram.net/entry/chainer_japanese

【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。
kenmatsu4
2015年09月27日に更新
https://qiita.com/kenmatsu4/items/7b8d24d4c5144a686412

Chainer 2.0 のMNISTサンプルで推論を動かす
abechi_17
2017年07月01日に投稿
https://qiita.com/abechi_17/items/b271b7042fae126616d7

chainer 1.11.0以降のmnistを解説
tommyfms2
2016年10月19日に更新
https://qiita.com/tommyfms2/items/a2f23acbf515fba3495b

2016年11月20日
【Chainer】mnistサンプルコードからエッセンスだけ抽出してみた
http://akasuku.blog.jp/archives/67271420.html

関連記事
Count per Day
    Popular Posts
    スポンサーリンク

    シェアする

    • このエントリーをはてなブックマークに追加

    フォローする