概要
AlexNet について解説し、Pytroch の実装を紹介します。
AlexNet
ResNet は、画像認識のコンテスト ILSVRC 2012 にて、優勝した CNN ネットワークモデルです。下記、論文に基づいて解説します。
ImageNet Classification with Deep Convolutional Neural Networks
Local Response Norm
現在は層の出力の正規化は Batch Normalization が主流ですが、当時はまだなかったので Local Response Norm が使われていました。Local Response Norm は入力を次の式で変換する層です。
bc=ack+nαc’=max(0,c–n/2)∑min(N–1,c+n/2)ac’2−β
- ac: Local Response Norm の入力。特徴マップのある位置のチャンネル c の値。
- bc: Local Response Norm の出力。
- α,β,k: パラメータ
- n: サイズ。平均をとる範囲のこと。
- N: 特徴マップのチャンネル数
Local Response Norm
特徴マップのある位置のチャンネル c の値を ac とすると出力 bc は、チャンネル方向の 2n の範囲の二乗の平均を n1∑c’=max(0,c–n/2)min(N–1,c+n/2)ac’2 で計算し、それを α,β,k という3つのパラメータで調整した値を ac に乗算して計算しています。min(N–1,c+n/2),max(0,c–n/2) は平均をとる範囲が [0,N–1] からはみ出さないようにするためについています。
Pytorch では、LocalResponseNorm で実装されています。
AlexNet の構造
以下が論文に記載された AlexNet の構造です。当時の GTX 580 はメモリが3Gしかなかったため、1つの GPU にモデルを載せることができませんでした。そのため、論文では出力数を半分にしたモデルを作成し、最後に結合する構造になっていますが、今の GPU はメモリが十分あるので、チャンネル数を2つ合わせた1つのモデルにします。
AlexNet の構造
- 論文中の上図ではモデルの入力サイズが (224×224) となっていますが、その場合 kernel_size=11, stride=4 の畳み込みを行った場合、出力サイズが (54×54) となり、論文と一致しません。そのため、入力サイズは (227×227) の typo であると思われます。
- Local Response Norm のパラメータは論文の Section 3.3 に従い、n=5,α=0.0001,β=0.75,k=2 とします。
- Dropout の確率は論文の Section 4.2 に従い、p=0.5 とします。
- 重みの初期化方法は論文の Section 5 に従い、畳み込み層は μ=0,σ=0.01 のガウス分布、2、4、5個目の畳み込み層のバイアスは1、その他の層のバイアスは0で初期化します。
torchvision の AlexNet
torchvision の AlexNet は上記で紹介したものと以下の点が異なります。
- 入力サイズは (227, 227) から (224, 224) にし、代わりに最初の Conv2d に padding=2 を入れて出力が (55, 55) になるように調整しています。
- 5つの畳み込み層の出力数がそれぞれ
96, 256, 384, 384, 256
から 64, 192, 384, 256, 256
になっています。
- LocalResponseNorm はなくなっています。
- 入力サイズが (224, 224) より大きい場合、最後の畳み込み層の出力が (6, 6) より大きくなります。次の全結合層は (6, 6) の入力を想定しているため、AdaptiveAvgPool2d を適用し、(6, 6) にプーリングします。
- Dropout の場所が
fc1->ReLU->Dropout->fc2->ReLU->Dropout->fc3
ではなく、Dropout->fc1->ReLU->Dropout->fc2->ReLU->fc3
になっています。
torchinfo を使用して、各層の出力サイズを確認します。
==========================================================================
Layer (type:depth-idx) Output Shape Param #
==========================================================================
AlexNet -- --
├─Sequential: 1-1 [1, 256, 12, 12] --
│ └─Conv2d: 2-1 [1, 64, 103, 103] 23,296
│ └─ReLU: 2-2 [1, 64, 103, 103] --
│ └─MaxPool2d: 2-3 [1, 64, 51, 51] --
│ └─Conv2d: 2-4 [1, 192, 51, 51] 307,392
│ └─ReLU: 2-5 [1, 192, 51, 51] --
│ └─MaxPool2d: 2-6 [1, 192, 25, 25] --
│ └─Conv2d: 2-7 [1, 384, 25, 25] 663,936
│ └─ReLU: 2-8 [1, 384, 25, 25] --
│ └─Conv2d: 2-9 [1, 256, 25, 25] 884,992
│ └─ReLU: 2-10 [1, 256, 25, 25] --
│ └─Conv2d: 2-11 [1, 256, 25, 25] 590,080
│ └─ReLU: 2-12 [1, 256, 25, 25] --
│ └─MaxPool2d: 2-13 [1, 256, 12, 12] --
├─AdaptiveAvgPool2d: 1-2 [1, 256, 6, 6] --
├─Sequential: 1-3 [1, 1000] --
│ └─Dropout: 2-14 [1, 9216] --
│ └─Linear: 2-15 [1, 4096] 37,752,832
│ └─ReLU: 2-16 [1, 4096] --
│ └─Dropout: 2-17 [1, 4096] --
│ └─Linear: 2-18 [1, 4096] 16,781,312
│ └─ReLU: 2-19 [1, 4096] --
│ └─Linear: 2-20 [1, 1000] 4,097,000
==========================================================================
Total params: 61,100,840
Trainable params: 61,100,840
Non-trainable params: 0
Total mult-adds (G): 2.44
==========================================================================
Input size (MB): 2.08
Forward/backward pass size (MB): 13.98
Params size (MB): 244.40
Estimated Total Size (MB): 260.46
==========================================================================
モデルの一覧
参考
コメント