VGGNet論文コメント

7351 ワード

VGGNet


要旨:モデル性能に及ぼすネットワーク深さの重要な影響を記述する論文.

Abstract



緑色解釈では,複数の3 x 3 Convフィルタを積層することで性能が向上し,大規模な画像認識においても良好な結果が得られた.

Introduction



同様に,深さも非常に重要であり,そのために多くのパラメータを修正し,ボリューム層を安定に積層して深さを増大させた.各層は小さな3 x 3 convフィルタを用いて実現した.

ConvNet Configurations


Architecture



まず構造を見て、以下のようにまとめることができます.

入力値:224 x 224 RGB画像
入力された画像は、3 x 3 Convfilter(左/右、上/下、中)のConvNetを使用します.このとき、非線形性を実現するために、1 x 1 Convフィルタも適用される.
空間解像度を維持するためにstreep,paddingはそれぞれ1を適用する.
Poyounglayerは5つの最大プール層からなり,2 x 2サイズステップ長は2であった.
Conv Layersの後ろには3つのFC層がある.最初の2つは4096チャンネルで、最後の1つは1000チャンネルです.
最後にSoftmax layerを適用します.
すべての非表示レイヤはRELUアクティブ化関数を使用しますが、ローカルレスポンスの正常化(LRN)はパフォーマンスに影響を与えず、メモリの使用量が増加し、時間が長くなるため使用されません.

Configurations



深さによって構造は徐々に変化し,11〜19層構造を有するモデルに分けられる.Conv layerの幅は64から始まり,2の2乗増加ごとに最大512増加した.深くなっても、逆に広いConv layerを使うよりも少ないパラメータが出てくるそうです.

Discussion





大きなConv filterの代わりに複数の3 x 3 Conv filterを使用する理由は、小さなサイズの複数のアプリケーションがより多くのReluを通過し、非線形結果値をよりよく導出するためである.また,パラメータの数も減少する.
3 x 3 Conv filterを2つ使用する場合に必要なパラメータの数:2(323^232 C^22)=18 C 2^22、5 x 5 Conv filterを1つ使用する場合に必要なパラメータの数は25 C 2^22となり、パラメータの減少が見られます.

また、Cモデルでは、1 x 1 Conv layerを追加し、ReLUにより追加の非線形性を実現することもできる.
import torch
import torch.nn as nn
class VGG_A(nn.Module):
    def __init__(self, num_classes: int = 1000, init_weights: bool = True):
        super(VGG_A, self).__init__()
        self.convnet = nn.Sequential(
            # Input Channel (RGB: 3)
            nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1, stride=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2), # 224 -> 112
            
            nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1, stride=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2), # 112 -> 56
            
            nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=1, stride=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, padding=1, stride=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2), # 56 -> 28

            nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, padding=1, stride=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2), # 28 -> 14

            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2), # 14 -> 7
        )

        self.fclayer = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, num_classes),
            # nn.Softmax(dim=1), # Loss인 Cross Entropy Loss 에서 softmax를 포함한다.
        )
    
    def forward(self, x:torch.Tensor):
        x = self.convnet(x)
        x = torch.flatten(x, 1)
        x = self.fclayer(x)
        return x

Classification Framwork


Training



研修では学習時に設定したパラメータについて説明した.
batch_size : 256
momentum : 0.9
weight decay : 0.0005
drop out : 0.5
epoch = 74
lr=0.01(検証誤差が大きいほど10倍減少)
また、VGGENETはAlexNetの学習と同様であり、AlexNetよりも深く、より多くのパラメータを有していても、より小さなフィルタサイズと特定の層での事前初期化があり、epochがより少ない.
Pre-initialization

まずAモデルを学習し、次に次のモデルを構成するときに、Aで学習したlayerを使用して最適な初期値を設定します.これにより勾配消失問題を解決し,epochを短縮した.
ll-layerの間にconvlayerを追加し、13-layerを作成し、convlayerを追加し、16,19レイヤを順に作成します.

VGGモデルを学習する場合は、入力サイズに合わせて調整する必要があります.Sは訓練画像のScaleパラメータであり,入力画像の縦横2辺の中でこのSにより小さく対応する.Sが224であると仮定し、寸法を変更すると元の寸法のアスペクト比と一致する.次に224 x 224ヤードに切り、inputサイズを調整します.



Sの設定方法は大きく2種類あります.
Single Scale Training
Sを256または384に固定します.256を用いて学習を行い,384を用いて高速学習を行う場合,10‐310^{−3}10‐3よりも予め訓練された重みを用いたlrを用いる.
Multi-Scale Training
Sは固定されず、256〜512の間でランダムに設定される.ほとんどの画像のサイズが異なるので、この方法でより良い学習結果を期待することができます.この方式をScale Jitteringと言います.

Testing



以前trainフェーズで使用したSパラメータと同様にtestフェーズではQパラメータが使用される.QとSは必ずしも同じではないが,S値ごとに異なるQ値を適用するとモデルの性能が良くなる.
既存のCNNモデルでは,FC層を用いた場合のノードの個数はHyperParameterによって決定されるため,Convolutionで特徴を抽出してFC層に渡す際に用いられるパラメータも決定される.したがって,画像の大きさが変化すると,Conv layerとFC layerの間で必要なパラメータ数が変化するため学習できない.VGGNETは以下の方法でこれらの問題を解決した.
完全接続レイヤが接続レイヤに変換されます.最初のFC層は7 x 7 Conv層であり、最後の2層は1 x 1 Conv層に変換される.FCレイヤと1 x 1 Convレイヤは、FCNがすべてのノードを次のレイヤのすべてのノードに接続するため、競合する可能性があります.

転送時には入力画像のサイズを調整する必要がありますが、FC層は1 x 1 Conv層に変換されているため、テストでサイズを調整する必要はありません.しかし、最終的なoutput feature map sizeはinput image sizeに依存する.output feature map sizeが1 x 1でない場合はclass score mapと呼ばれ、mean or average poolingが適用されます.

Classification Experiments


Single Scale Evaluation



top-1エラーは多種類の分類エラーであり、top-5エラーは予測の最初の5つの結果に正解の割合がないことを意味する.
深さが深まるにつれて結果はますます良くなり、scaleが震えると結果はもっと良くなります.

Multi-Scale Evaluation



Q値がS-32,S,S+32に変化して確認した結果.
同様にscaleジッタの結果,single scaleよりも良好なerror数値が記録された.

Multi-Crop Evaluation



多作と密植を組み合わせて使用すると、より良い効果が得られる.

ConvNet Fusion



パフォーマンスを向上させるためにモデルを組み合わせた結果、値が表示されました.7つのモデルを組み合わせて最終結果として提出し,その後D,Eのみを組み合わせて誤差値をさらに低減した.