本博文主要介紹了VGGNET的網(wǎng)絡(luò)結(jié)構(gòu)枚荣,并在cifar10數(shù)據(jù)集上實(shí)現(xiàn)了
VGGNET詳解
??VGG Net由牛津大學(xué)的視覺(jué)幾何組(Visual Geometry Group)和 Google DeepMind公司的研究員一起研發(fā)的的深度卷積神經(jīng)網(wǎng)絡(luò)损肛,在 ILSVRC 2014 上取得了第二名的成績(jī),將 Top-5錯(cuò)誤率降到7.3%胎源。它主要的貢獻(xiàn)是展示出網(wǎng)絡(luò)的深度(depth)是算法優(yōu)良性能的關(guān)鍵部分。
??VGGNET的網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示,VGGNET包含多層網(wǎng)絡(luò)舷胜,深度從11層到19層不等,較為常用的是VGG16和VGG19活翩,接下來(lái)我們以VGG16為例烹骨,即下圖中的D翻伺,介紹VGGNET。
- 輸入尺寸為的圖片沮焕,用64個(gè)的卷積核作兩次卷積和ReLU,卷積后的尺寸變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=224%5Ctimes224%5Ctimes64" alt="224\times224\times64" mathimg="1">吨岭。
- 池化層,使用峦树,池化單元大小為辣辫,池化后尺寸變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=112%5Ctimes112%5Ctimes64" alt="112\times112\times64" mathimg="1">。
- 輸入尺寸為空入,使用128個(gè)的卷積核作兩次卷積和ReLU络它,尺寸改變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=112%5Ctimes112%5Ctimes128" alt="112\times112\times128" mathimg="1">。
- 池化層歪赢,使用化戳,池化單元大小為,池化后尺寸變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=56%5Ctimes56%5Ctimes128" alt="56\times56\times128" mathimg="1">埋凯。
- 輸入尺寸為点楼,使用256個(gè)的卷積核作三次卷積和ReLU,尺寸改變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=56%5Ctimes56%5Ctimes256" alt="56\times56\times256" mathimg="1">白对。
- 池化層掠廓,使用,池化單元大小為甩恼,池化后尺寸變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=28%5Ctimes28%5Ctimes256" alt="28\times28\times256" mathimg="1">蟀瞧。
- 輸入尺寸為,使用512個(gè)的卷積核作三次卷積和ReLU条摸,尺寸改變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=28%5Ctimes28%5Ctimes512" alt="28\times28\times512" mathimg="1">悦污。
- 池化層,使用钉蒲,池化單元大小為切端,池化后尺寸變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=14%5Ctimes14%5Ctimes512" alt="14\times14\times512" mathimg="1">。
- 輸入尺寸為顷啼,使用512個(gè)的卷積核作三次卷積和ReLU踏枣,尺寸改變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=14%5Ctimes14%5Ctimes512" alt="14\times14\times512" mathimg="1">。
- 池化層钙蒙,使用茵瀑,池化單元大小為,池化后尺寸變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=7%5Ctimes7%5Ctimes512" alt="7\times7\times512" mathimg="1">仪搔。
- 與兩層1x1x4096瘾婿,一層1x1x1000進(jìn)行全連接+ReLU(共三層)。
- 通過(guò)softmax輸出1000個(gè)預(yù)測(cè)結(jié)果。
VGGNET的特點(diǎn)
VGGNET全部使用的卷積核和的池化核偏陪,通過(guò)不斷加深網(wǎng)絡(luò)深度來(lái)提升性能抢呆。作者認(rèn)為,兩個(gè)卷積層的串聯(lián)相當(dāng)于1個(gè)的卷積層笛谦,3個(gè)的卷積層串聯(lián)相當(dāng)于1個(gè)7*7的卷積層抱虐,即3個(gè)卷積層的感受野大小相當(dāng)于1個(gè)的卷積層。但是3個(gè)的卷積層參數(shù)量只有的一半左右饥脑,同時(shí)前者可以有3個(gè)非線性操作恳邀,而后者只有1個(gè)非線性操作,這樣使得前者對(duì)于特征的學(xué)習(xí)能力更強(qiáng)灶轰。
VGGNet的卷積層有一個(gè)顯著的特點(diǎn):特征圖的空間分辨率單調(diào)遞減谣沸,特征圖的通道數(shù)單調(diào)遞增。
代碼實(shí)現(xiàn)
import torch.nn as nn
cfg = {
'VGG11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
'VGG13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
'VGG16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
'VGG19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
}
class VGG(nn.Module):
def __init__(self, vgg_name):
super(VGG, self).__init__()
self.features = self._make_layers(cfg[vgg_name])
self.classifier = nn.Linear(512, 10)
def forward(self, x):
out = self.features(x)
out = out.view(out.size(0), -1)
out = self.classifier(out)
return out
def _make_layers(self, cfg):
layers = []
in_channels = 3
for x in cfg:
if x == 'M':
layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
else:
layers += [nn.Conv2d(in_channels, x, kernel_size=3, padding=1),
nn.BatchNorm2d(x),
nn.ReLU(inplace=True)]
in_channels = x
layers += [nn.AvgPool2d(kernel_size=1, stride=1)]
return nn.Sequential(*layers)
def VGG11():
return VGG('VGG11')
def VGG13():
return VGG('VGG13')
def VGG16():
return VGG('VGG16')
def VGG19():
return VGG('VGG19')