前の記事でVisual Recognition(VR)とTensorFlow(TF)を比較してみたのだけど、とりあえず動かしたレベルだったので、もう少しちゃんと比較してみようと思ってやってみた。
ルール
VRの入力ファイルは10000枚まで(Positiveイメージ、Negativeイメージそれぞれ10000枚までっぽい)なので、各数字1000枚ずつ、0~9で10個あるので合計10000枚をトレーニング・セットとして使うこととした。
MNISTのトレーニング・セットは全部で55000枚あるが、数字ごとに5500枚ずつというわけではなかったりする。こんなんでいいんだろうか。まぁいいのか。
トレーニング完了後、テスト・セットを使ってトレーニング精度を判定する。MNISTは10000枚のテスト・セットがある。それを全て投入して正答率(Accuracy)を比較しようというのがこの企画である。
Visual Recognitionの場合
VRでは、Positiveイメージ1000個、Negativeイメージ9000個でClassifierを作る。これを0~9まで10回繰り返した。
トレーニングにかかる時間はClassifier1つあたり1~2時間程度かかった。複数あると時間かかりまくり…と思ったら並行して実行できた。並行度いくつまでいけるのかは不明。一度試してみたい。
VRは判定時のClassifierを絞ることができるので、0~9までのリストを作って判定時に使用した。
VRはscore(=確信度)が0.5未満だとクラスを返してくれないので、その場合は間違いとして判定した。
その結果、VRの正答率は0.9840(98.4%)。意外と高かった。前の記事で書いたとおり、VRの得意な画像サイズは320x320。一方MNISTの画像サイズは28x28。これはダメかな…と思ったけど、結構な高さを見せてくれてびっくり。
TensorFlowの場合
チュートリアルにはBeginnersとExpertsの2つのモデルがある。せっかくなのでそれぞれやってみた。
Begineers
デフォルトではランダムで100個選ぶのを1000回繰り返す。合計10万文字でトレーニングさせるわけだが、ランダムなので何が選ばれるかわからないわけだがこれでいいのだろうか。
今回は10種類あるので、それぞれ10文字ずつ合計100文字選ぶのを100回繰り返すことで1万文字の学習を完了させる。
その結果、正答率は0.8469。ちょっと低いかな、と思って、さらに10回ループして合計10万文字分学習した。結局同じ文字を10回ずつ使ったわけだが。その結果、正答率は0.8846。少し上昇したがこんなものか。
学習時間は1万回で1秒未満、10万回でも6秒台でありVRよりも大幅に短いわけだが、この正答率は果たして良いのか悪いのか。
(※Core i5 3320MをVM環境下で2コア使用した場合。時間はマシンスペックに大いに影響されるはず。これが速いのか遅いのかはわかりません。以下同じ。)
Experts
Expertsは、50個ランダムで選ぶのを2万回ループする。つまり合計100万文字でトレーニングさせている。これを、今回のルールに合わせて、頭から50個(5個×10文字)選ぶのを200回ループして1万文字トレーニングするようにした。
正答率は0.9224。まあまあだったが、せっかくなのでさらに10回ループして合計10万文字分のトレーニングをさせたら、正答率は0.9723まであがった。
学習時間は1万回で2分弱、10万回で15分台。VRに比べたら、まだまだ短い。
この結果をグラフにするとこんな感じになる。
Visual Recognitionはトレーニング回数とかわからないので一定の0.9840にしている。
それに対して、TensorFlowの方がトレーニング回数を横軸にしてプロットすると以下のとおり。
TensorFlowは学習回数が増えることで、きちんと正答率があがっているのがグラフからもわかる。
追加実験
Expertsはどこまで学習したらVRに追いつくのだろうか。
ということで、学習回数を増やしてみて、その結果をグラフにまとめてみた。
トレーニング時間はどんどん増えていき、今回のVRの平均トレーニング時間である1時間半に近づいていっている。
今回の結果だけを見れば、20万回あたりが時間と正答率のバランスがいいように思える。
もちろんこの結果は、TensorFlowのモデルを使った場合だし、データとしてはMNISTの場合に限ったことだし、このPCを使った場合の話である。TensorFlowの入力/出力が変われば結果はガラっと変わってくるだろう。
では、Watson VRとTensorFlow、どちらが優秀なのか。幸か不幸か、それは全く断言できない結果となったと思う。VRが劣勢だろうなと思っていたけども、前の記事のとおりVRもそんなに悪くないし、こうやって数値化するとなおさら悪くない、むしろ良いとさえ思わせられる。
結局、簡単に使い始めたい、アプリからの呼び出しもあれこれしたい、というのであればWatson VRがいいだろう。逆に、自分でモデルをきめ細かく定義して最適化したいのであればTensorFlow(またはその他のDeep Learningのライブラリー)を使う必要がある、ということか。
おわりに
比較してみると、なかなか面白い結果になって個人的には満足。そして次回はVisual Recognitionの性能を試すべく、ちょっとした実験をした結果を紹介したいと思う。