(第8回)MNIST(その2)
第6回でも使っていましたが、誤差逆伝播法を使うと高速で学習ができるようになります。さらに、OrderedDictを使って、より簡単に使えるように変更します。
(参考サイト)https://github.com/oreilly-japan/deep-learning-from-scratch
<実装する>
基本は第6回と同じです。
①データセット
同じ物を使います。
train-images-idx3-ubyte.gz
train-labels-idx1-ubyte.gz
t10k-images-idx3-ubyte.gz
t10k-labels-idx1-ubyte.gz
次に下の6つのファイルをダウンロードします。
mnist.py
two_layer_net.py
gradient_2.py
functions.py
layers.py
util.py
次は、メインのプログラムになります。下のプログラムと同じフォルダに上の10個(4個のデータセット+6個のプログラム)のファイルを保存しておきます。
このプログラムを実行すると、最初は、「mnist.pkl」というデータセットのファイルが無いので、最初にダウンロードした4個のファイルを展開して、データセットを 作成します。実際には、
このような出力になっていると思います。学習用のデータセット「mnist.pkl」が作成されます。その後学習が進みます。(1万回学習)学習が完了すると、
他に「My_w1.pkl」「My_w2.pkl」「My_b1.pkl」「My_b2.pkl」の4つのファイルが作成されます。
この4つが重み付けのモデルになります。学習済みですので、これを読みだせば、自分の書いた文字を判定して
なんの数字なのか?判定できるようになります。
作成したモデルの利用するプログラムは以下のとおりです。(メインと同じフォルダに保存します)
同じフォルダに「test.png」という手書き文字の画像を保存して、上のプログラムを実行します。
手書き文字を28x28に変換して、学習済みモデルに通した後の出力を計算することができます。
出力:[[-1.991 0.1099 1.199 0.710 -0.415 -0.869 -3.016
3.801 -1.052 1.493]]
このように、「7」の可能性が最も高いとが出力できています。7に近い形の2や9の確率も高めなのもわかります。
今回のMNISTには「two_layer_net.py」にOrderedDictをインポートしています。「Affine1(w1,b1)」→「ReLU」→「「Affine2(w2,b2)」→「SoftmaxWithLoss」
の順で計算をさせている部分にOrderedDictが利用されていて、簡単に呼び出すことができるように作られています。
-------------