2018.07.05

CapsNetがConvNet(CNN)に勝るのかを毒キノコ画像判別で試してみた


こんにちは。次世代システム研究室のK.S.(女性、外国人)です。

今回のブログでは前回紹介したブログ「Capsule Network(新Neural Network)で毒キノコ画像を判別してみました」に残った課題についての実験を共有したいと思います。

このブログはある程度Convolutional Neural Network (ConvNet、CNN)とCapsule Network (CapsNet) への理解のある方のために書くつもりですので、初めてご覧になる方は、先に前回のブログに目を通して頂ければと思います。

前回のブログはConvNetというニューラルネットワーク(有名なディープラーニングの一つ)を説明した上で、CapsNetという新しいニューラルネットワークを紹介しました。理論的に、CapsNetがどのような方向でConvNetを改良したのも簡単に説明しました。それから、簡単なCapsNet実装例として毒キノコ画像判別を行いました。ある程度CapsNetを紹介したつもりでしたが、毒キノコ画像判別例では本当にCapsNetがConvNetに勝るのか、きちんと確認できませんでした。そこで、今回のブログはこの課題にチャレンジしたいと思います。

このブログの構成は、以下のとおりです。

   ① ConvNet とCapsNetの実装テスト
   ② 毒キノコ画像判別でConvNet とCapsNetの比較
   ③ まとめと考察

まず、ConvNet とCapsNetのネットワークモジュールを作成します。それから、よく使われているCIFAR10という画像データセットを利用し、作成したConvNet とCapsNetが本当に効果的であるかを確認します。最後に、毒キノコ画像判別でConvNet とCapsNetの性能を比較します。今回の実装コードはgithubにも置きましたので、検討の参考になればと思います。


① ConvNet とCapsNetの実装テスト


ConvNetは素晴らしい技術で画像学習によく使われています。しかし、ConvNetのアルゴリズムには空間的位置関係が含まれていません。そこで、入力する画像が回転すると、ConvNetの性能が落ちます。この問題は写真の向きや位置が違う大量のデータを用意し、学習すれば解決可能ですが、この欠点に対処するためには大量のデータやコストの高い計算などが必要となります。CapsNetは、上下が逆になったり、回転した入力画像に対処するため、発明された新しいニューラルネットワークです。つまり、CapsNetは有名な画像学習のアルゴリズム(ConvNet)の改良版です。どれくらい改良されたか、CapsNetが出版された論文での説明もあります。毒キノコ画像判別のため、まず、論文の再現をしてみました。例として、広く使われているCIFAR10サンプルを使い、ConvNetとCapsNetを比較します。

では、早速実装を始めましょう!

実装環境

実装環境はこの前のブログと同じで、 GMOアプリクラウドを利用しました。

サンプル

ConvNetとCapsNetの実装がうまく行くかどうかを確認するため、広く使われている CIFAR10を利用します。CIFAR10データセットは10カテゴリの32ピクセル x 32ピクセル x 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(実際の演算を後から挿入するために、とりあえず仮に計算行列のサイズを確保する)をします。次に、二つのConvolutional layersを作成し、layersの中にneuronsを作成します。それから、full connected layers(全結合層)し、学習のoverfittingを避けるため、dropout層の中で、一部のノードをdropoutします。最後の出力はscalarになります。

CapsNetは図1の右側に示します。まず、vector(大きさと向き)で画像を入力し、placeholderをします。次に、Primary capsulesを作成します。Primary capsulesの中に、二つのConvolutional layersも含まれます。ここではlayerの中にneuronsの代わりにcapsulesを作成します。それから、Primary capsulesができたら、Digit capsulesを作成します。最後の出力はvectorになります。

図1のflowchartでイメージがなかなかつかめない方は図2を参考にして下さい。イメージしやすいように、別のサイトからの画像を転載させて頂きます。実際に使ったネットワークサイズは異なるので、ご注意下さい。

 

 

図2: ConvNetとCapsNetのイメージ このサイトこのサイトより転載
 

Flowchartを見て頂くと、ConvNetとCapsNetのアルゴリズムが違うということが見られますが、具体的に主に違うところは、どの辺にあるのか、表1でまとめました。

表1:ConvNetとCapsNetの主な違い

操作 ConvNet CapsNet
1. 入力と出力の形 Scalar(大きさ) Vector(大きさと向き)
2.非線形変換:neuronの活性化関数 Relu Squash
3.重み付け biasあり biasなし
4.空間的な位置関係 Pooling Dynamic routing
 

表1のとおり、まず、入力と出力の形が違います。ConvNetはscalarで、CapsNetはvectorです。入力後、ConvNetもCapsNetもConvolutional layerを使いますが、layerの中には少し違います。ConvNetのConvolutional layerの中にはneuronの活性化関数としてRelu関数を使い、空間的な位置関数を表すためpoolingを利用します。一方、CapsNetのPrimary CapsulesのConvolutional layerの中にはReluの代わりにSquash関数を使い、空間的な位置関数を表すためDigit Capsulesのところにdynamic routingが提案されました。

ConvNetとCapsNetのモジュール

図1のアルゴリズムでConvNetとCapsNetに基づいて、それぞれのモジュールを作成しました。詳細コードはここを参考にして下さい。今回はtensorflowのコードを見せるより、コードから作られたネットワークの出力は表2で示します。表2を見て頂くと、CapsNetのネットワークサイズの方が大きいということがわかります。

表2:ConvNetとCapsNetモジュールのネットワーク出力
 

実装条件

Number of label = 10
Batch size = 20
Epoch = 1000

学習とテスト結果

CIFAR10サンプルを利用し、作ったConvNet とCapsNetモジュールで学習してみました。学習結果は図3になります。


図3:CIFAR10サンプルでConvNetとCapsNetの学習結果
 

図3による、ConvNetより、CapsNetの方が学習回数は少なかったことが見られました。簡単なstudent t-testの結果によると、ConvNetとCapsNetの学習精度は有意差(p-value<0.05)がありました。しかし、正しく測定していませんが、実際の計算時間はCapsNetの方が長かったです。CapsNetのネットワークの方が何倍も大きいので、処理時間がかかってしまうだと考えられます。また、個人的な印象として学習精度のギザギザな動きが少し変だと感じましたが、今回はモデルチューニングなどが目的ではありませんので、このまま使っていきます。ConvNet とCapsNet、それぞれの学習モデルを利用して、テストの画像で予測精度をテストしました。今回のテスト結果による、ConvNet精度は77.50%、CapsNet精度は90.00%でした。よい結果ではないですが、ある程度大丈夫そうですので、それらのモジュールで毒キノコ画像の比較実験を行っていきます。


② ConvNet とCapsNetで毒キノコ画像判別


ここでは「① ConvNet とCapsNetの実装テスト」で作ったプログラムを利用し、毒キノコ画像判別を行います。サンプルは前回のブログと同じです。ここで、もう少しCapsNetの性能実験をしたいと思います。前回も説明しましたが、CapsNet はConvNetの空間的位置関係の問題に対策するための手法です。どれくらい改良されたか、CapsNetが出版された論文ではなく、毒キノコ画像判別のような実際の画像になると、どうなるのか。また、どれくらいCapsNetが回転した入力画像に対処できるのか。疑問をお待ちになりませんか?

そこで、この疑問を明らかにするための実験を計画しました。ここでは、様々な視点で検討するため、二つの実験を行ってみました。

実験①

前回と同じく4種類のキノコの画像を利用します。だた、今回は学習画像の向きと位置は回転しません。一方、学習モデルをテストするときには、向きや位置が回転された画像を使います。もし、CapsNetが本当に空間的位置関係の問題に対応できるとしたら、画像を回転しなくても、画像を予測できるだろうと思われます。

実行条件は下記になります。
Number of label = 4
Batch size = 4
Train Epoch = 1000
Test samples = 100 batches

学習結果は下記になりました。


図4:キノコ画像実験①の学習結果
 

各バッチ画像4枚だけで学習したため、学習回数が少ないかもしれません。今回は20Epoch以下で学習が終わったようです。また、続けて学習しても20Epochから1000 Epochまで学習精度は変わりませんでした。少しoverfittingしていたようでしたが、とりあえず今回はこのままの学習モデルをテストしていきます。そこで、1000Epochで学習したあと、100バッチで学習性能をテストしました。テストの際、同じ画像を使いましたが、前述の通り、テスト画像はランダムで向きや位置を回転しました。テスト結果によると、ConvNetの予測精度は25.250%、CapsNetの予測精度は37.625%でした。予測精度はCapsNetの方が比較的よい結果と言えますが、どちらでもまだ十分ではないと思います。

実験②

実験②はベンチマークテストのような実験を行いたいと思います。実験②の条件はほぼ実験①と同じです。ただ、学習するときに、4種類のキノコの画像それぞれの位置と向きをランダムで回転します。もちろん、学習モデルをテストするときにも向きや位置が回転された画像を使います。回転された画像も学習するので、空間的位置関係に対応できなくても、様々なパターンの画像を学習できる可能性が高くなります。この場合はConvNetがCapsNetに勝る可能性があります。一方、位置の回転角度はランダムなので、同じ回転度の画像になる確率は低いと考えられます。この場合は実験①よりConvNetの性能がもっと下がる可能性があります。また、もし、CapsNetがきちんと空間的位置関係に対応できたら、CapsNetの学習結果は変わらないだろうと考えられます。

学習結果(図5)は下記の通りです。


図5:キノコ画像実験②の学習結果


学習は1000 Epochまで行いました。CapsNetは30Epoch以内で学習精度が75%まで上がりました。しかし、ConvNetは1000Epochまででも、学習精度は50%までしか上がりませんでした。ConvNetの学習精度が上がらない一つ理由は回転角度の種類が多すぎたせいからかもしれません。もし、ランダムではなく、決まった回転度の画像を使えば、ConvNetの性能がよくなるかもしれません。また、テスト結果によると、ConvNetの予測精度は24.250%、CapsNetの予測精度は39.625%でした。実験①の結果とあまり変わらず、CapsNetの方がConvNetより、予測精度が高かったです。いずれにしても、今回の結果はどちらともまだ不十分なものでした。画像を変えたり、チューニングしたりすれば、よりよい結果が得られる可能性が高くなりますが、モデルのチューニングは今回の実験では主眠としていないので、行いませんでした。


③ まとめと考察


毒キノコの画像判別でConvNetとCapsNetの性能を比較してみました。結果は、CapsNetはConvNetの画像回転の問題に対応できそうですが、スピードの面ではCapsNetの方が何倍か計算時間がかかりました。この辺の発展がないと、本当にCapsNetがConvNetに勝るということはまだきちんと言えないかもしれません。しかしながら、個人的にはCapsNetの発展に期待していきたいと思います。

最後に

次世代システム研究室では、ビッグデータ解析プラットホームの設計・開発を行うアーキテクトとデータサイエンティストを募集しています。興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧からご応募をお願いします。

一緒に勉強しながら楽しく働きたい方のご応募をお待ちしております。