ImageNet用ResNet50での信号の流れを追ってみた [学問]
最近、専門書をワクワクしながら読み進めるというような経験はあまり無くなってしまったが、唯一の例外がオライリー・ジャパンから出ている「ゼロから作るDeep Learning①〜③」のシリーズです。③はDeep Learningの「フレームワーク」の作り方についてですが、PFI/PFNのChainerのフレームワークにかなり近いものになっているようです。②は「自然言語処理」に関する内容だったので、自分としては、後、「音声処理」と「強化学習」の2冊を是非上梓して頂きたいなと思っています。
カレントなプログラミングにおいては、フレームワークは重要な技術の一つになっています。有名なものとしては、Webアプリケーションのフレームワーク(MVCモデル)があります。Rubyが世界的に使われるようになったきっかけは、Ruby on Railsがあったからです。またPHPにもCakePHP、Symfony、Laravel、etc、色々なフレームワークがありますし、PythonにはDjangoがあります。私は、機械学習用のオープンソースのフレームワークとしては、Tensorflow(+Keras)とChainerの2つを使っていますが、その他にもCaffe、PyTorch、etc、もあります。
③の第5ステージのステップ58では、実際にDeZeroのフレームワークを使ってImageNet用にVGG16のCNNを構築する例が出ていますが、そのおまけで、ResNetのコードも掲載されていたので、そこからResNetでの信号の流れを追ってみました。(ResNetはResNet50、ResNet101、ResNet152の3種類ありますが、その中で一番簡単なResNet50のものを掲載してあります。)ResNetもVGG16と同様に既に調整済みのパラメータで公開されているものをダウンロードする事で、実物の環境をDeZero上で再現出来るようになっています。
ResNetの構成はVGG16に比べてかなり複雑なので、下記の参考文献のTable 1.あたりを参考にしながら下図を見ていただければ、やっていることがよく分かると思います。
下図において、
・X(Number, Channel, Height, Width) = 入出力信号のサイズ
・conv1~4(Channel, kernel_size, stride, pad) = 下の「緑のブロック」、または「黄色のブロック」(()内は Conv2dの引数)
・緑のブロック = Conv2d(Channel, kernel_size, stride, pad) -> BatchNorm() -> relu()の3層構造
・黄色のブロック = Conv2d(Channel, kernel_size, stride, pad) -> BatchNorm()の2層構造
・加算演算子記号 = 加算器 -> relu()の2層構造
・~xN = ~のブロックをN回繰り返す
です。
by チイ
コメント 0