Network In Networkを動かしてみた

2016-10-05

画像処理のニューラルネットワークの解説記事とかを見ているとNetwork In Networkというものがよく参照されていて、パラメータが少なくて層を厚くできてよいということだったので試してみた。

論文

論文はNetwork In Network。従来の畳込みニューラルネットワークではパッチ内の畳み込みを線形モデル(Generalized Linear Model, GLM)で行っているが、これは線形分離可能であることを仮定している。 これを多層パーセプトロンを使ったマイクロネットワークに置き換えることによって一般化する。

さらに、従来の畳込みニューラルネットワークでは畳み込んだあとに全結合層で接続して望みのクラスかどうかの分類を行うが、畳込み層で作られた特徴マップがどのように使われるのかブラックボックスになってしまう。 それをこの論文では、全結合層を入れずに全体を平均プーリングして(Global Average Pooling)望みのクラス分の特徴マップに変換し、直接判定する。

実装

これをどうやって実装するのかなとググったところ、TFLearnの例が見つかった。 ソースを見てみると、5x5のconv_2dの後に1x1のconv_2dを2回とか、全然違うじゃん!と思ったんだけど、これでいいらしい。 1x1で2段階の畳み込みをすることで、各ピクセル位置に対する特徴をニューラルネットワークで学習することになる。 (でも1x1の畳み込みは1回でいいんじゃないかと思うんだけど?)

動作

でNetwork In NetworkをMNISTに対して動かしてみたけどあまり性能が出なくて、89%くらいにしかならなかった。 また1x1の畳み込みをせずに、全結合層の代わりにGlobal Average Poolingだけを適用してみたけど、それも性能は良くなかった。

Classification datasets resultsにはエラー率0.47%と書かれているので、なんか実装をミスっているんだろうか…。

参考