GMOインターネットTopへTOP研究開発トピックスブログ成長とキャリアプラン参加プロジェクト採用情報2018.07.05CapsNetがConvNet(CNN)に勝るのかを毒キノコ画像判別で試してみたTweetPocketこんにちは。次世代システム研究室のK.S.(女性、外国人)です。Network)で毒キノコ画像を判別してみました」に残った課題についての実験を共有したいと思います。理解のある方のために書くつもりですので、初めてご覧になる方は、先に前回のブログに目を通して頂ければと思います。前回のブログはConvNetというニューラルネットワーク(有名なディープラーニングの一つ)を説明した上で、CapsNetという新しいニューラルネットワークを紹介しました。理論的に、CapsNetがどのような方向でConvNetを改良したのも簡単に説明しました。それから、簡単なCapsNet実装例として毒キノコ画像判別を行いました。ある程度CapsNetを紹介したつもりでしたが、毒キノコ画像判別例では本当にCapsNetがConvNetに勝るのか、きちんと確認できませんでした。そこで、今回のブログはこの課題にチャレンジしたいと思います。このブログの構成は、以下のとおりです。CapsNetのネットワークモジュールを作成します。CapsNetが本当に効果的であるかを確認します。CapsNetの性能を比較します。今回の実装コードはgithubにも置きましたので、検討の参考になればと思います。CapsNetの実装テストConvNetは素晴らしい技術で画像学習によく使われています。ConvNetのアルゴリズムには空間的位置関係が含まれていません。そこで、入力する画像が回転すると、ConvNetの性能が落ちます。この問題は写真の向きや位置が違う大量のデータを用意し、学習すれば解決可能ですが、この欠点に対処するためには大量のデータやコストの高い計算などが必要となります。CapsNetは、上下が逆になったり、回転した入力画像に対処するため、発明された新しいニューラルネットワークです。CapsNetは有名な画像学習のアルゴリズム(ConvNet)の改良版です。どれくらい改良されたか、CapsNetが出版された論文での説明もあります。毒キノコ画像判別のため、まず、論文の再現をしてみました。例として、広く使われているCIFAR10サンプルを使い、ConvNetとCapsNetを比較します。GMOアプリクラウドを利用しました。CIFAR10を利用します。RGB3チャンネル(色)画像が用意されています。それぞれのカテゴリは50000枚の学習(train)画像データがあり、10000枚テスト(test)画像データがあります。このサンプルでうまくConvNetとCapsNetの実装ができれば、後ほど、行いたい毒キノコ画像に適用することも簡単になると考えられます。ConvNetとCapsNetのアルゴリズムConvNetとCapsNetを比較するため、具体的にどうやったか、前回のブログでは理論的に説明しましたので、今回は実装操作の詳細を説明したいと思います。ConvNetとCapsNetの実装アルゴリズムは図1にまとめました。両方の実装はTensorflow(googleが開発した機械学習ライブラリ)を利用しました。図1:ConvNetとCapsNetの実装アルゴリズム図1は今回の実装アルゴリズムになります。左側はConvNet、右側はCapsNetです。ConvNetは図1の左側に示します。scalar(大きさ)で画像を入力し、placeholder(実際の演算を後から挿入するために、とりあえず仮に計算行列のサイズを確保する)をします。layersを作成し、layersの中にneuronsを作成します。layers(全結合層)し、学習のoverfittingを避けるため、dropout層の中で、一部のノードをdropoutします。最後の出力はscalarになります。CapsNetは図1の右側に示します。vector(大きさと向き)で画像を入力し、placeholderをします。capsulesを作成します。layersも含まれます。ここではlayerの中にneuronsの代わりにcapsulesを作成します。capsulesを作成します。最後の出力はvectorになります。図1のflowchartでイメージがなかなかつかめない方は図2を参考にして下さい。イメージしやすいように、別のサイトからの画像を転載させて頂きます。実際に使ったネットワークサイズは異なるので、ご注意下さい。このサイトとこのサイトより転載Flowchartを見て頂くと、ConvNetとCapsNetのアルゴリズムが違うということが見られますが、具体的に主に違うところは、どの辺にあるのか、表1でまとめました。routing表1のとおり、まず、入力と出力の形が違います。ConvNetはscalarで、CapsNetはvectorです。layerを使いますが、layerの中には少し違います。layerの中にはneuronの活性化関数としてRelu関数を使い、空間的な位置関数を表すためpoolingを利用します。routingが提案されました。ConvNetとCapsNetのモジュール図1のアルゴリズムでConvNetとCapsNetに基づいて、それぞれのモジュールを作成しました。詳細コードはここを参考にして下さい。今回はtensorflowのコードを見せるより、コードから作られたネットワークの出力は表2で示します。表2を見て頂くと、CapsNetのネットワークサイズの方が大きいということがわかります。CapsNetモジュールで学習してみました。学習結果は図3になります。図3による、ConvNetより、CapsNetの方が学習回数は少なかったことが見られました。t-testの結果によると、ConvNetとCapsNetの学習精度は有意差(p-value<0.05)がありました。測定していませんが、実際の計算時間はCapsNetの方が長かったです。CapsNetのネットワークの方が何倍も大きいので、処理時間がかかってしまうだと考えられます。個人的な印象として学習精度のギザギザな動きが少し変だと感じましたが、今回はモデルチューニングなどが目的ではありませんので、このまま使っていきます。CapsNet、それぞれの学習モデルを利用して、テストの画像で予測精度をテストしました。今回のテスト結果による、ConvNet精度は77.50%、CapsNet精度は90.00%でした。よい結果ではないですが、ある程度大丈夫そうですので、それらのモジュールで毒キノコ画像の比較実験を行っていきます。CapsNetの実装テスト」で作ったプログラムを利用し、毒キノコ画像判別を行います。サンプルは前回のブログと同じです。ここで、もう少しCapsNetの性能実験をしたいと思います。ConvNetの空間的位置関係の問題に対策するための手法です。どれくらい改良されたか、CapsNetが出版された論文ではなく、毒キノコ画像判別のような実際の画像になると、どうなるのか。どれくらいCapsNetが回転した入力画像に対処できるのか。疑問をお待ちになりませんか?そこで、この疑問を明らかにするための実験を計画しました。ここでは、様々な視点で検討するため、二つの実験を行ってみました。実験1前回と同じく4種類のキノコの画像を利用します。今回は学習画像の向きと位置は回転しません。学習モデルをテストするときには、向きや位置が回転された画像を使います。CapsNetが本当に空間的位置関係の問題に対応できるとしたら、画像を回転しなくても、画像を予測できるだろうと思われます。実行条件は下記になります。batches学習結果は下記になりました。各バッチ画像4枚だけで学習したため、学習回数が少ないかもしれません。今回は20Epoch以下で学習が終わったようです。Epochまで学習精度は変わりませんでした。overfittingしていたようでしたが、とりあえず今回はこのままの学習モデルをテストしていきます。そこで、1000Epochで学習したあと、100バッチで学習性能をテストしました。テストの際、同じ画像を使いましたが、前述の通り、テスト画像はランダムで向きや位置を回転しました。テスト結果によると、ConvNetの予測精度は25.250%、CapsNetの予測精度は37.625%でした。予測精度はCapsNetの方が比較的よい結果と言えますが、どちらでもまだ十分ではないと思います。実験2実験2はベンチマークテストのような実験を行いたいと思います。実験2の条件はほぼ実験1と同じです。学習するときに、4種類のキノコの画像それぞれの位置と向きをランダムで回転します。学習モデルをテストするときにも向きや位置が回転された画像を使います。回転された画像も学習するので、空間的位置関係に対応できなくても、様々なパターンの画像を学習できる可能性が高くなります。この場合はConvNetがCapsNetに勝る可能性があります。位置の回転角度はランダムなので、同じ回転度の画像になる確率は低いと考えられます。この場合は実験1よりConvNetの性能がもっと下がる可能性があります。CapsNetがきちんと空間的位置関係に対応できたら、CapsNetの学習結果は変わらないだろうと考えられます。学習結果(図5)は下記の通りです。Epochまで行いました。CapsNetは30Epoch以内で学習精度が75%まで上がりました。ConvNetは1000Epochまででも、学習精度は50%までしか上がりませんでした。ConvNetの学習精度が上がらない一つ理由は回転角度の種類が多すぎたせいからかもしれません。ランダムではなく、決まった回転度の画像を使えば、ConvNetの性能がよくなるかもしれません。テスト結果によると、ConvNetの予測精度は24.250%、CapsNetの予測精度は39.625%でした。実験1の結果とあまり変わらず、CapsNetの方がConvNetより、予測精度が高かったです。いずれにしても、今回の結果はどちらともまだ不十分なものでした。画像を変えたり、チューニングしたりすれば、よりよい結果が得られる可能性が高くなりますが、モデルのチューニングは今回の実験では主眠としていないので、行いませんでした。毒キノコの画像判別でConvNetとCapsNetの性能を比較してみました。結果は、CapsNetはConvNetの画像回転の問題に対応できそうですが、スピードの面ではCapsNetの方が何倍か計算時間がかかりました。この辺の発展がないと、本当にCapsNetがConvNetに勝るということはまだきちんと言えないかもしれません。個人的にはCapsNetの発展に期待していきたいと思います。最後に次世代システム研究室では、ビッグデータ解析プラットホームの設計・開発を行うアーキテクトとデータサイエンティストを募集しています。募集職種一覧からご応募をお願いします。一緒に勉強しながら楽しく働きたい方のご応募をお待ちしております。