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のみを組み合わせて誤差値をさらに低減した.
Reference
この問題について(VGGNet論文コメント), 我々は、より多くの情報をここで見つけました
https://velog.io/@kimkihoon0515/VGGNet-논문-리뷰
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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
Reference
この問題について(VGGNet論文コメント), 我々は、より多くの情報をここで見つけました https://velog.io/@kimkihoon0515/VGGNet-논문-리뷰テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol