chainerでCNN組んでラーメン画像分類 (やってみた)

動機

 どこかのphp入門書の帯にラーメンの種類(味噌ラーメンとか塩ラーメンとか)を機械学習で(?)見分けるという売り文句書いていたので、それにインスパイアされ、初心者にはうってつけの題材だと思ったので、chainerのCNN(Convolutional Neural Network)手習いとしてやってみました。

とりあえず読んだ本は

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

要件

 画像から何ラーメンか見分けたい。以下のようにフォルダごとに分けた学習用画像がある。
f:id:SyureNyan:20171107001933p:plain
中身は各種類の画像(写真はつけ麺フォルダ)
f:id:SyureNyan:20171107002116p:plain

 種類は家系ラーメン、二郎系ラーメン、味噌ラーメン、塩ラーメン、とんこつラーメン、つけ麺の7種類である。これらでCNNのモデルに学習させて分類器を生成する。

環境

 MacBook Pro f:id:SyureNyan:20171107002842p:plain
Python 2.7.10
chainer 3.0.0

実装

datasetを作るやりかた。

 非常に役に立ちました。
qiita.com

モデル

5層のネットワークです。畳み込みのパラメータは適当
1と2、2と3の間が畳み込みで繋がれて3と4, 4と5の間が全結合です。
特に根拠はありませんが、これのmnistの例を参考にしてみました。

Chainer v2による実践深層学習

Chainer v2による実践深層学習

f:id:SyureNyan:20171108231235p:plain

学習結果

validation/main/accuracyがmain/accuracyと乖離し、6割止まりであるため、
過学習していると思われます。
f:id:SyureNyan:20171108231315p:plainf:id:SyureNyan:20171108231317p:plain


モデル、パラメータ、学習データをチューニングする必要がありそうです。
一応ソースも貼っておきます。
github.com


次回、いろいろ真面目に?チューニングがしたいの巻です。たぶん。