MATHGRAM

主に数学とプログラミング、時々趣味について。

python: chainerを使って化物語キャラを認識させるよ! 〜part6 主要キャラで多値分類(GPU使ったよ編)〜

GPU。さっそく試してみました。

-- 目次 --

まずは2値分類してみる。

ここから主要キャラの分類

最初の目次とは大幅に変わっていますが、GPU編をpart6として更新します。
faster-RCNNはまだできそうにないです。。。

前回からの改良点とコメント

  1. 画像の回転は左右反転以外削除した
  2. 翼の三つ編みver.とショートver.は別クラスとして学習
  3. 前回より画像枚数を半分くらいに減らした

まず1.の部分について。
最近読んだ本の中に"教師データを増やすことはいいことだが、文字などを反転させると意味合いが変わってきてしまうので注意しよう"的なことが書いてありました。

読んだときはそりゃそうだろwと半ば当たり前と思っていたのですが、"いやアニメ顔を上下反転させてんのもダメってことじゃね?"と思い、このような判断をしました。

次は2.について。これは本当にミスったな〜と思っていた部分です。三つ編みとショートを同じクラスにしたらパラメータが混乱してしまうに決まってますよね。
人間も外見に変化があった人間に対して、その状態から新たにラベリングしているのかな〜なんて考えるきっかけにもなりました。

例えば、めっちゃ久しぶりにあったAさんが凄い太っていたとして、それでも人間はその状況からすぐに"太ってちょっと見た目変わってるけどこの人はAさんだ"と、認識(ラベリング)をすることができますよね。
実際にどんな判断で認識しているのか僕は知りませんが(調べろよっていうツッコミはなしで!)普段当たり前だと思いスルーしてた部分に気づきを与えてくれたいいミスでした。

バサ姉に感謝!!

最後に3。これは1.の処理をしている時点で当たり前なのですね。ただ画像数が多いほど良い!というわけでもないようで。う〜ん確かに、そりゃそうだとも思いますがちゃんと理解はできてないです。。。まだまだ勉強不足なのでこのあたりははっきりさせたいところですね。なにはともあれ、画像数が減ったのでかなり学習スピードは上がりました。

環境のまとめ

  • ubunru 14.04 LTS
  • anaconda2-2.4.0
  • GPU GeForce GT 650M/PCIe/SSE2
  • 訓練データ

負例: 8000枚 正例: 各キャラ1400枚ずつ

  • テストデータ

負例: 2000枚 正例: 各キャラ200枚ずつ

学習の推移

こんな感じでした。

epoch: 1
2016-04-08 20:15:17.785450
train mean loss=1.29663467101, accuracy=0.573903162782
test  mean loss=0.688977219347, accuracy=0.778639320674
epoch: 2
2016-04-08 20:27:27.011629
train mean loss=0.808145953271, accuracy=0.735576269734
test  mean loss=0.469432424767, accuracy=0.850425204764
epoch: 3
2016-04-08 20:39:30.309131
train mean loss=0.594597480004, accuracy=0.804364624796
test  mean loss=0.353783556145, accuracy=0.891195591299

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

epoch: 19
2016-04-08 23:52:14.426065
train mean loss=0.116009275227, accuracy=0.960536485817
test  mean loss=0.10884310774, accuracy=0.975237621553
epoch: 20
2016-04-09 00:04:15.928162
train mean loss=0.11445670401, accuracy=0.960945668777
test  mean loss=0.105532796335, accuracy=0.972236120713
epoch: 21
2016-04-09 00:16:17.488941
train mean loss=0.124914951081, accuracy=0.959581722737
test  mean loss=0.110439470158, accuracy=0.973986994481
epoch: 22
2016-04-09 00:28:21.348996
train mean loss=0.110901836548, accuracy=0.962218685648
test  mean loss=0.110624593335, accuracy=0.971485745495

収束しだしたのがだいたいエポック15〜20くらい。accuracyも前回とは比べて大幅にあがってます。

また、しょぼいGPUにも関わらずかなり速度はあがりました。CPUでは12時間以上かかってましたからね。
GPUでは半分以下になってます。(正直半分って微妙だけどw)
おそらく画像を適当な数に調整できたのも効果が出ていますね。

epochは30まで続きますがほとんどここから変化はなかったです。

認識結果

色分けは前回同様です。
負例が水色
暦が黒、ひたぎが紫、翼が白、真宵がオレンジ、駿河が青、撫子がピンク、忍が黄色、火憐が赤、月火が緑

まあまあうまく出来てるやつ

f:id:ket-30:20160409010912p:plain:w400:h400f:id:ket-30:20160409010929p:plain:w400:h220f:id:ket-30:20160409011308p:plain

微妙だったやつ

兄妹・・・
f:id:ket-30:20160409012035p:plain:w300:h500

ガハラさん&駿河のショートカットはダメか〜。
あと撫子にはかなり弱いみたい・・・
f:id:ket-30:20160409012144p:plain

暦と認識されてるのがチラホラ・・・
f:id:ket-30:20160409013831p:plain

まとめ

感覚としては少し上がったかな〜くらいの感じでした。acc見て期待しただけにちょっと残念。。。
根本的に何がダメなのかわかってない気がするのでもっと色々試して改善を図っていきたいです。

とりあえず以上!
超人工生命ハッカソンに参加するので楽しんできます!