- 勉強を兼ねて、実際にニューラルネットワークで多値分類をやってみたい!
- けどMNISTはもういいや、ほかの題材でやりたい!
- しかし、画像はどうやってあつめようか。撮影するっていっても枚数いるしなぁ・・・あ、iPhoneの連射機能つかえばいいじゃん!
というわけで、そのときたまたま目に入ってきた息子のプラレール新幹線を撮影して多値分類に挑戦。その過程でやったこと、わかったことを書いていきます。
5種類の新幹線で実験
- 左から
- 500系
- 700系
- E5系(はやぶさ)
- E6系(こまち)
- E7系(かがやき)
- 手元にあったのがこの5車種だったので、これらを使うことにした。
- 新幹線以外のプラレールは新幹線と大きく形状がことなるので、問題としておもしろくないかな、と思い省いた。
計1000枚ほど撮影
- iPhoneの連射(バースト)機能をつかって、車両の周囲と屋根部分をぐるっと撮影
- 1車両ごとに200枚程度撮影
- 背景を変えたり、レールに載せたり、カーブに合わせてまげたり、といった画像は今回は撮っていない。
- 多少手振れ画像になっていたり、自分の影が落ちていたりする画像があるが、気にせず使用
実験ではグレースケール画像を使用
- 新幹線はそれぞれ色がことなるのでカラー画像だと簡単すぎるかと思い、グレースケール画像にすることで形状によって分類できるかを実験することにした。
まずはシンプルなネットワーク構造で実験
- 隠れ層無し、入力層と出力層のみ
tensorflow
f = tf.matmul(x, w) + b
p = tf.nn.softmax(f)
- 画像サイズは 504 x 378 ⇒ 入力層のノード数は190512
- wとbは0で初期化
- 誤差関数は交差エントロピー
- 確率的勾配下降法を使用。バッチ数は100。エポックは5000。学習時間は30分ほど。
- 用意した画像のうち、ランダムに選択した100枚をテスト用画像として、それ以外をトレーニング用画像として使用した。
エポック1000で正解率93%!
- シンプルなネットワークの割には高い数値じゃないだろうか・・・正直おどろいてしまった。
- エポックをさらに増やせば誤差の値はまだ下がりそう
判定ミスした画像は人間には簡単な画像
- 判定ミスした画像には各新幹線の特徴的な部分がうつってなかったのか?と思い確認してみると、そんなことはなく、人間には簡単に判定できる画像ばかりだった。そこが反対に面白いなと感じた。
- よく見ると自分の手などがうつりこんでいる。でもいいノイズだと思うので今後もこのまま使う。
エポックを増やしたら正解率が100%に
- 誤差はまだ順調にさがりそうだったので、試しにエポックを10000にしてみたところ6100あたりで正解率100%になってしまった。ニューラルネットワークおそるべし・・・。
- おそらく問題が簡単すぎるのだろう。次回は背景などを変えた画像をもっと増やすことにする。