SONY Neural Network Console でミニ VGGnet を作る

今回もニューラルネットワークの設計をやってみます

こんにちは cedro です。

前回のAlexnetに続き、今回も過去に発表された有名なモデルを参考に、ニューラルネットワークの設計をしてみます。

使用するデータセットは、前回同様CIFAR-10で、カラー32×32ピクセル10種類の画像が、学習ファイル50,000枚評価ファイル10,000枚あるものです。

 

VGGnet とは?

さて、今回参考にするニューラルネットワークは、画像認識コンテストILSVRC2014年に2位になったVGGnet です。

この年の優勝はGooglenetなのですが、VGGnet は前回参考にしたAlexnetの進化形で、構造がシンプルで美しく、今でも良く使われるニューラルネットワークなので、こちらを参考にします。

早速設計図を見てみましょう。

 

作ったのは、オックスフォード大学VGGVisual Geometry Group)というチームで、色々なバリエーションがありますが、良く見るのはこのVGG-16というやつ。なんか正統派って感じですね。

名前の由来は、VGGチームが作った、畳み込み13全結合層3層16層のニューラルネットワークということで、VGG-16となっているそうです。

 

mini_VGGnet の設計

さて、これを参考に、どうニューラルネットワークを設計するかですが。

例によって、ILSVRの入力サイズは224×224CIFAR-10のサイズは32×32なので、大胆にも最初の畳み込み4層分は省略して、畳み込み層の5層目からスタートすることにします。

また、GPU無し環境を考慮して、畳み込み各層の画像枚数はオリジナルの/にしておきます。

 

設定をまとめてみるとこんな感じです。

 

上記の設定をSONY Neural Network Console に入力すると、こんな感じになります。長くなるので、2列表記にしています。

基本的にはmini_ALexnetと同じ様な構造ですが、畳み込み層が5→9へ増え、よりディープなニューラルネットワークになっています。このモデルの名前は、mini_VGGnetと名付けます

なお、先回mini_Alexnet の時に畳み込み層1と2に入れていた、Batch Normazilation は、省いておきました。なぜなら、Batch Normazilation が発表されたのは2015で、VGG16の発表は2014ですから、時代考証すると、入れてはまずいからです(笑)。

 

学習・評価の実行

まず例によって、5epoch やってみて感触を掴みます。

 

畳み込み層5→9のアップは伊達じゃなく、5epoch に何と8時間15分掛かりました。さあ、これだけ時間を掛けたんだから、精度はさぞや期待できそうかな、と思って評価結果を見てみると。

 

ガーン!なんと精度は70.34 ! mini_Alexnet5epoch の時の精度は73.07%ですから、mini_Alexnet より悪い結果なんです。うーん、何が悪いんだろう。

 

何が影響しているのか?

なぜ、2014年モデルが2012年モデルに負けてしまうのか。

思い当たるのは、mini_Alexnet には時代考証を無視して、Batch Normazilation を畳み込み層の1と2に入れた事くらいですが、それがそんなに効くとも思えないし、と悩んでいました。

しかし、Webで調べていると、こんな記述がありました。

Batch Normalizationは2015年にSergey IoffeとChristian Szegedyが提案した手法。具体的には、ミニバッチごとに平均が0,分散が1になるように正規化を行うことで、学習の収束速度の向上、Dropoutの必要性の低下、事前学習の必要性低下 などの効果が得られる。

 

また、こんな強烈なコメントもありました。

Batch Normalization を使っていないやつは、人生を無駄にしている。

もしかしたら、意外に効果があるのかもしれない。しかし、もし本当に効果がある手法であれば、最新のモデルには必ず使ってあるはず、どんな使い方をしているのかも含めて、調べてみようと思いました。

そういえば、ILSVRC2015年に優勝したResnetが、Neural Network Consoleのサンプルプロジェクトの中にあったなーと思い出し、確認してみると。

 

なんと驚いたことに、Resnetには全ての畳み込み層の後に、必ずBatch Normalization が入っていました。

なるほど、そういうことですか。それならと、mini_VGGnet 9つの畳み込み層の後には全部 Batch Normalization を入れてみることにしました。Mini_VGGnet_MarkⅡと名付けます(笑)。

 

mini_VGGnet MarkⅡの設計

 

設定をまとめると、こうなります。Batch Normalization 9 個追加!

 

Neural Network Console に入力すると、こんな形。とりあえず学習を 5epoch やります。

 

再度、学習・評価

Batch Normalization を9層追加した結果、学習時間は1時間34分伸びましたが、Validation Error は明らかに改善されているようです。

 

恐る恐る、Confusion Mtrix を見てみると、なんと驚いたことに、精度が10以上もアップして、80.71に!

Batch Normalization の威力凄い!何か、ネットワーク構造の革新より、この手法の方が効きが大きいんじゃないかと思うほどでした。

 

最終的には、10epoch の学習まででギブアップ。掛かった時間は17時間16分。私の MacbbokAir くん大変お疲れ様でした。

 

精度は83.52%でした。もっとやってみたい気はするが、ここまでにしました。

しかし、こういう展開になって来ると、GPUが付いた本格的なマシンが欲しくなりますねー。少なくとも10倍くらい早くなるとすると、17時間掛かったのが2時間かからずに終わってしまうわけですから。

ちょっと危険ですねー、この展開(笑)。

では、また。

2 件のコメント

  • いつもお世話になります。kotaiです。
    Google GroupsにSony NN Consoleの掲示板があります。
    先日、CNNの認識率が良くない話があって、「Cedro3さんのMini-AlexnetやMini-VGGnetを使ったら認識率がアップしました。」と私が返答をしたら、別のネットワークでも認識率がアップしたとの報告がありました。
    シンプルで面白い構成だったため、リンクを貼らせて頂きます。
    https://groups.google.com/forum/#!topic/neural_network_console_users_jp/1JbhearzgzY

    • kotai さん

       コメントありがとうございます。
      シンプルなネットワークでGOODですね。
      情報ありがとうございます。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

    ABOUTこの記事をかいた人

    2017年8月に、SONY Neural Network Console に一目惚れして、ディープラーニングを始めました。初心者の試行錯誤をブログにしています。