マトリョーシカ的日常

ワクワクばらまく明日のブログ。

ぜんぜんディープじゃないディープラーニング学習/ 手書き数字認識

f:id:kyokucho1989:20180820041341j:plain
Photo by Kalen Emsley

 昆虫には足が六本ある、という旨を息子に伝えてやると、彼はカブトムシの足を数え始めた。五本くらいあったようだ。虫かごで飼われているそれも、最近は食欲が落ちてきたようで、昆虫ゼリーの減りが遅くなっている。数日前から涼しい風が吹いてきて、ようやく人間が生活できる環境が整ってきた。昨日の最高気温は三十二度だったらしい。夏が終わらない。

 ディープラーニングの学習をちょっとすすめた。本に書かれていた「手書き数字の認識」をした。これはMNISTという手書き文字の画像データセットを使って、機械にその画像が数字の何であるかを理解させるものだ。先ほどになって、ようやくサンプルコードのありかがわかった。URLが本に書かれていた。今まで私はなにを見ていたのだ。以下からいろいろ見れる。

GitHub - oreilly-japan/deep-learning-from-scratch: 『ゼロから作る Deep Learning』のリポジトリ

 今回の勉強で使ったのは、上記URLのサンプルコードのうち、

  • ch3フォルダ
    • neuralnet_mnist.py
    • sample_weight.pkl
  • commonフォルダ
    • functions.py
  • datasetフォルダ
    • mnist.py

である。

 実際にコードを動かすためにはフォルダの場所に少し注意する必要があった。

+ch3フォルダ
-neuralnet_mnist.py
-sample_weight.pkl
    +commonフォルダ
    -functions.py
    +datasetフォルダ 
    -mnist.py

 こんな感じでch3フォルダの中にcommonとdatasetを入れてやるといい。わお。
そうしてneuralnet_mnist.pyを実行すると、「Accuracy:0.9352」と出た。この一行だけだが無事に何かが出力されると嬉しい。

 これだけではよくわからないのでいろいろ調べた。まず、MNISTデータセットについて。これは手書きっぽい数字のモノクロ画像データがたくさん入っていて、それぞれに答えのラベルがついている。ひとつの画像のサイズは28x28で、それぞれのピクセルは0~255をとっている。数値が高いということはそのピクセルの白さが強くなるのかなと勝手に思っている。

 サンプルコードの中を読んだ。ちょっと意味がわからなかった。とりあえず、なんやかんやあって、予測した数値と答えのラベルがあっていればaccuracy_cntというのが1増えていく、というのは理解できた。あと、"sample_weight.pkl"というのを開いてなにかやってるようだった。拡張子がpklのファイルを開く方法は下のサイトに載っていた。
Pythonでコマンドラインからpickleの中身を確認する

python -m pickle sample_weight.pkl

 これを実行すればよさそうだった。

f:id:kyokucho1989:20180819055429p:plain
 インターネッツって素晴らしいね。

 でも数字を眺めたところでどうしようもなかった。なんだこれ。あ、重みか。もしかして、この重みを機械が勝手に調整してくれるのがディープラーニングなのか。だとしたらすごいね。今回は用意している重みを利用しただけだから全然ラーニングじゃなかったのか。そうか。

 あとはsoftmax()というのが気になった。これはソフトマックス関数と呼ばれていて、活性化関数のひとつらしい。機械学習のうち「分類問題」の出力層で使うそうだ。数式で表すと
 y_k=\displaystyle \frac{ exp(a_k)}{\sum_{i=0}^n  exp(a_i) }
 となる。

 ソフトマックス関数の出力は0から1.0の間の実数になります。また、ソフトマックス関数の出力の総和は1になります。
(中略)ソフトマックス関数の出力を「確率」として解釈することができます。
p70


 なるほど!今回は手書きの数字が0から9のどれかを予測するため、きっと「0の確率:9%、 1の確率:2% .....」というかんじに計算されているのだろうね。

 さて、こうやって参考書のサンプルコードを見ながら学習を進めていけば、まぁそれなりに理解は深まる気はする。気はするがなんだかしっくりこない。やっぱりオリジナルの何かを作っておきたい。でも、いったいどこへ進んでいけばいいのか。

blog.aidemy.net

 ここらへんからいろんな記事を見た。綾鷹を画像認識で選ばせていたり、モザイクをとっていたりした。個人的にいちばんとっつきやすそうなのは画像認識かなと思う。サンプルも豊富でたくさんの人がおもしろそうなことをやってるし。問題は画像をどこから採取するかということと、画像データをどう整えてあげるかということか。まぁ、やっていきましょう。


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装