ResNetを実装しました。
ResNetとは
「Deep Residual Learning for Image Recognition」という論文で提案されているネットワーク
下図のような構成のものを作り、入力値を出力値に足し合わせて学習を行う。
詳細な情報は日本語の優良記事が非常に多いのでそちらを参照してほしい。
ResNetをベースとして多くの○○Netが提案されており、画像認識系をやるなら押さえておいたほうがいいことは間違いない。
ResNetの登場以前、画像認識では層の深さを増すと精度が良くなることが知られていた。しかし、あるラインを越えると勾配が消失し、精度が上がりづらくなってしまっていた。その時点で精度と層の深さを高いレベルで両立させていたのがILSVRC2014で優勝したGoogLeNet(22層)である。
その翌年、ResNetが152層という圧倒的な層構造をひっさげやってきて、GoogLeNetの「誤差6.66%」を大きく引き離す「誤差3.57%」を叩き出して優勝した。
ここで問題なのが何故152層も作って勾配が消失しないのかだ。勾配消失問題に対するResNetの対策は入力を出力に足すというもの(上記画像の右側のライン)でうまいこと回避しているらしい(これも続けすぎるといずれ消失してしまうのではないか…?)
ResNetのアーキテクチャの詳細
正直上記画像は簡略すぎて実装なんてとてもできないので詳細をここに書いておく。
畳み込みのフィルタ数とウィンドウサイズは論文に記載されているのでそれを見てほしい。バッチ正規化なんて文言はどっから来たんだ・・・という方は論文の3.4を見てほしい。一文でしれっと書いてある。
実装
ResNetをkerasで実装したのでgithubにあげた。cifar-10を分類するようにしている(平均色を引くとかはしていない)