CNNを少しかじった

Courseraの機械学習の講義も全て受け終わり課題も全て提出が終わりました。

Courseraの講義も受け終わったので次は何か応用面をやろうと思いCNNに手を出してみました。

いろいろと実装が楽と言われているKerasにて実装していろいろ自分で分析をしてみました。

今回使ったのはKeras , matplotlib , Jupyter Lab。

データセットはMNISTを使いました。

CNNのモデルはKerasリポジトリのexamplesにあるものをそのまま使いました。

examplesにあるCNNのコード

github.com

MNISTとは

MNISTは28x28ピクセルの手書き数字が書かれた小さめな画像が大量にあるデータセットです。

60k個のtraining set,10k個のtest setがあります。

トレーニングセットで使うのは60k個の方です。

とりあえずデータの一部を見てみましょう。

f:id:abc10946:20180521125904p:plain

CNNのモデル

今回使うCNNのモデルはこんな感じのです。

これはKerasリポジトリのexamplesにあるシンプルなもので畳み込み層が2つしかないものです。

もっと高度はモデルであるVGG16とかは畳み込み層が13個あります。

f:id:abc10946:20180521130133p:plain

これだけでも結構いい精度を出してくれます。

結果

学習させて認識率(accuracy)を見てみると98.86%ととても良い認識率であることが分かります。

CNNはフィルターという小窓を用いて画像のある程度の範囲をひとまとまりにして見ています。

そのため位置が近いピクセルでは色(今回は黒の濃淡の具合)がとても近い値をとっていたり、ある1つの手書き数字ではある範囲に必ずこの形が現れるといった特徴を捕らえやすくなります。

こういった仕組みからCNNは人間と同等または人間よりも上の認識率を持つことができます。

そのため今回のモデルが誤認識した1.14%は人間でも認識が難しいものとなります。

それをいくつか見ていきましょう。

正解:4

認識結果:2

f:id:abc10946:20180521131558p:plain

正解:9

認識結果:8

f:id:abc10946:20180521131608p:plain

正解:9

認識結果:8

f:id:abc10946:20180521131613p:plain

正解:6

認識結果:0

f:id:abc10946:20180521131617p:plain

これくらいなら人間でも読みにくいと思える字です。

Kerasを使ってみて

Tensorflowを使うよりも驚くほど簡単にモデルを作ることができるのでとても楽です。

KerasでGANの実装とかDQN実装とかしている記事もあるのでそれを参考に画像生成、強化学習あたりにも手を出していく所存です。

参考文献

Keras Documentation