cedro-blog

PyTorch 次に Alexnet を作ってみる

今回は、PyTorch で Alexnetを作り CIFAR-10を分類してみます。

こんにちは cedro です。

新年から、PyTorchニューラルネットワーク実装ハンドブックを斜め読みしながらコードをいじっています。

第4章に、CIFAR-10をAlexNetを真似た構造のネットワークで画像分類するところがあるのですが、実はこれと同じ様な内容のブログ「SONY Neural Network Console でミニAlexnet を作る」を書いたことがあって、とても懐かしい気がしました。

ということで、今回は、PyTorch で Alexnetを作り CIFAR-10を分類してみます。

 

Alexnet とは?

Alexnet は、画像認識コンテスト ILSVRC で2012年に優勝したネットワークで、コンテストに初めてディプラーニングを持ち込み、それまで人が見つけていた特徴量を機械自からが見つける形に転換することで認識精度の驚異的な改善を図り、画像認識の世界に革命を起こしました。

Alexnet 以降、画像認識はディープラーニング一辺倒になり、その将来性に目を付けたGoogle やFacebook百度は、ディープラーニングを研究している会社をどどん買収して行くことになります。

さて、その設計図を見てみましょう。

入力は 3チャンネルの244×244で、そこから後は上下に分かれて上の方は図が切れていますが、上下は同じものです。2つに分かれている理由は、2012年当時のGPUの性能から、全部を1枚のGPUに載せることはできなかったため2枚に分けたのです。

1) 3*224*224 を Convolution で kernel_size=11, stride=4, padding=2 → size=55*55
2) 96*55*55 を Max_pooling で kernel_size=3, stride=2 → size=27*27
3) 256*27*27 を Convolution で kernel_size=5, stride=1, padding=2 → size=27*27
4) 256*27*27 を Max_pooling で kernel_size=3, stride=2 → size=13*13
5) 384*13*13 を Convolution で kernel_size=3, stride=1, padding=1 → size=13*13
6) 384*13*13 を Convolution で kernel_size=3, stride=1, padding=1 → size=13*13
7) 256*13*13 を Convolution で kernel_size=3, stride=1, padding=1 → size=13*13
8) 256*13*13 を Max_pooling で kernel_size=3, stride=2 → size=6*6
8) dense_4096
9) dense_4096
10) dense_1000

これが、各ブロックの設定内容です。畳み込み5層+全結合層3層で、途中Max_poolingが3つ入っています。13*13 の畳み込みを3回繰り返しているのが印象的です。

 

ネットワークをPyTorch のコードで書くと、こんな形。但し、このモデルはILSVRCのコンテスト用のため入力は3*224*224が前提、一方CIFAR-10は3*32*32なので、修正が必要です。

そのため、最初のConv2dの設定を(kernel_size=11→3, stride=4→1, padding=2→1)に変更し画像サイズを変更させない様にします。そして、3つあるMaxPool2dの設定を(kernel_size=3→2)に変更します。

こうすることで、画像サイズが変化するのはMaxPool2dの3回だけになり、32*32→16*16→8*8→4*4 と全結合層の直前でなんとか4*4になるはずです。本当に、そうなるかチェックしてみます。

 

オリジナルバージョンとCIFAR-10バージョンで、全結合に繋がる直前の画像サイズを比較するコードです。もくろみ通りオリジナルは6*6、CIFAR-10は4*4 になっています。

後は、全結合層の nn.Linear(256 * 6 * 6, 4096) → nn.Linear(256 * 4 * 4, 4096) に変更し、接続の x = x.view(x.size(0), 256 * 6 * 6) → x = x.view(x.size(0), 256 * 4 * 4) に変更すればOKです。

以下に全体のコードを記載します。

コード全体です。このままノートパソコンで動かすには、ちょっと重過ぎですので、今回は Google Colab のGPUを使ってみます。

 

Google Colabで、Python3 の新しいノートブックを開いて、ランタイムをGPUにしたら、このコードを入力しPyTorchをインストールします。後は、先程のコードをコピペして実行するだけです。

それにしても、WebでGPU環境が無料で手に入るなんて、素晴らしい時代になったものです。

 

学習結果です。20epochで、約80%の識別精度に到達しました。

PyTorchは昨年末に、待望のVer1.0がStableになり脂がのった状態になって来ました。Webでググると様々な情報があって楽しそうです。今年、PyTorchさらに大きな広がりを見せそうな予感がします。

では、また。