VggNet网络结构详解
VggNet網絡結構詳解
#圖像識別網絡結構詳解
一、概述
VGG在2014年由牛津大學著名研究組VGG (Visual Geometry Group) 提出,斬獲該年ImageNet競賽中 Localization Task (定位任務) 第一名 和 Classification Task (分類任務) 第二名。
二、網絡詳解
VGG16相比AlexNet的一個改進是采用連續的幾個3x3的卷積核代替AlexNet中的較大卷積核(11x11,7x7,5x5)。對于給定的感受野(與輸出有關的輸入圖片的局部大小),采用堆積的小卷積核是優于采用大的卷積核,因為多層非線性層可以增加網絡深度來保證學習更復雜的模式,而且代價還比較小(參數更少)。
簡單來說,在VGG中,使用了3個3x3卷積核來代替7x7卷積核,使用了2個3x3卷積核來代替5*5卷積核,這樣做的主要目的是在保證具有相同感知野的條件下,提升了網絡的深度,在一定程度上提升了神經網絡的效果。比如,3個步長為1的3x3卷積核的一層層疊加作用可看成一個大小為7的感受野(其實就表示3個3x3連續卷積相當于一個7x7卷積),其參數總量為 3x(9xC^2) ,如果直接使用7x7卷積核,其參數總量為 49x(C^2) ,這里 C指的是輸入和輸出的通道數。很明顯,27x(C^2)小于 49x(C^2),即減少了參數;而且3x3卷積核有利于更好地保持圖像性質。下表1為各個網絡配置,表2為VGG-19網絡各層詳細情況,圖1為VGG-16結構圖
表1:各個網絡的配置
表2:VGG-19網絡各層詳細
圖1 VGG-16網絡結構圖
三、VGGNet改進點總結
1 使用更小的33卷積核,和更深的網絡。兩個33卷積核的堆疊相對于55卷積核的視野,三個33卷積核的堆疊相當于77卷積核的視野。這樣一方面可以減少參數(3個堆疊的33結構只有77結構參數數量的(333)/(77)=55%);另一方面擁有更多的非線性變換,增加了CNN對特征的學習能力。
2 在VGGNet的卷積結構中,引入1*1的卷積核,在不影響輸入輸出維度的情況下,引入非線性變換,增加網絡的表達能力,降低計算量。
3 訓練時,先訓練級別簡單(層數較淺)的VGGNet的A級網絡,然后使用A級網絡的權重來初始化后面的復雜模型,加快訓練的收斂速度。
4 采用了Multi-Scale的方法來訓練和預測。可以增加訓練的數據量,防止模型過擬合,提升預測準確率。
注:Single-Scale: 是指把一張圖片送到CNN;
Multi-Scale:一般會送到CNN十張圖片:比如高寬是256Χ256的圖片,Multi-Scale會在它的四個角以及中心進行裁剪 ,將其裁剪為10張 224Χ 224 的圖片,然后再進行翻轉,總共十張圖片,最后全部送到 CNN。
四、VGGNet存在問題
唯一的不足是,在進行反向傳播時,中間的卷積層可能會導致占用更多的內存。
五、VGG代碼
代碼如下(示例):
import torch.nn as nn import torch__all__ = ['VGG', 'vgg11', 'vgg11_bn', 'vgg13', 'vgg13_bn', 'vgg16', 'vgg16_bn','vgg19_bn', 'vgg19', ] model_urls = {'vgg11': 'https://download.pytorch.org/models/vgg11-bbd30ac9.pth','vgg13': 'https://download.pytorch.org/models/vgg13-c768596a.pth','vgg16': 'https://download.pytorch.org/models/vgg16-397923af.pth','vgg19': 'https://download.pytorch.org/models/vgg19-dcbb9e9d.pth','vgg11_bn': 'https://download.pytorch.org/models/vgg11_bn-6002323d.pth','vgg13_bn': 'https://download.pytorch.org/models/vgg13_bn-abd245e5.pth','vgg16_bn': 'https://download.pytorch.org/models/vgg16_bn-6c64b313.pth','vgg19_bn': 'https://download.pytorch.org/models/vgg19_bn-c79401a0.pth', }1.定義分類網絡結構
代碼如下(示例):
class VGG(nn.Module):# 定義初始化函數def __init__(self, features, num_classes=1000, init_weights=True):super(VGG, self).__init__()self.features = featuresself.avgpool = nn.AdaptiveAvgPool2d((7, 7))self.classifier = nn.Sequential(nn.Dropout(0.4),nn.Linear(512 * 7 * 7, 4096),nn.ReLU6(True),nn.Dropout(0.4),nn.Linear(4096, 2048),nn.ReLU6(True),nn.Dropout(0.4),nn.Linear(2048, num_classes),)if init_weights:self._initialize_weights()# 定義前向傳播函數def forward(self, x):x = self.features(x)x = self.avgpool(x)x = x.view(x.size(0), -1)x = self.classifier(x)return x# 定義初始化權重函數def _initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.BatchNorm2d):nn.init.constant_(m.weight, 1)nn.init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):nn.init.normal_(m.weight, 0, 0.01)nn.init.constant_(m.bias, 0)2 .定義提取特征網絡結構函數
代碼如下(示例):
def make_layers(cfg:list, batch_norm=False):layers = []in_channels = 3for v in cfg:if v == 'M':layers += [nn.MaxPool2d(kernel_size=2, stride=2)]else:conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)if batch_norm:layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)]else:layers += [conv2d, nn.ReLU(inplace=True)]in_channels = vreturn nn.Sequential(*layers) cfg = {'A0': [64, 'M', 128, 'M', 256, 256, 'M'],'A1': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M'],'A': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],'B': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],'E': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'], }3 . 定義實例化給定的配置模型函數
代碼如下(示例):
def vgg7(**kwargs):model = VGG(make_layers(cfg['A0']), **kwargs)return modeldef vgg7_bn(**kwargs):model = VGG(make_layers(cfg['A0'], batch_norm=True), **kwargs)return modeldef vgg9(**kwargs):model = VGG(make_layers(cfg['A1']), **kwargs)return modeldef vgg9_bn(**kwargs):model = VGG(make_layers(cfg['A1'], batch_norm=True), **kwargs)return modeldef vgg11(**kwargs):model = VGG(make_layers(cfg['A']), **kwargs)return modeldef vgg11_bn(**kwargs):model = VGG(make_layers(cfg['A'], batch_norm=True), **kwargs)return modeldef vgg13(**kwargs):model = VGG(make_layers(cfg['B']), **kwargs)return modeldef vgg13_bn(**kwargs):model = VGG(make_layers(cfg['B'], batch_norm=True), **kwargs)return modeldef vgg16(**kwargs):model = VGG(make_layers(cfg['D']), **kwargs)return modeldef vgg16_bn(**kwargs):model = VGG(make_layers(cfg['D'], batch_norm=True), **kwargs)return modeldef vgg19(**kwargs):model = VGG(make_layers(cfg['E']), **kwargs)return modeldef vgg19_bn(**kwargs):model = VGG(make_layers(cfg['E'], batch_norm=True), **kwargs)return modelif __name__ == '__main__':# 'VGG', 'vgg11', 'vgg11_bn', 'vgg13', 'vgg13_bn', 'vgg16', 'vgg16_bn', 'vgg19_bn', 'vgg19'# Examplenet13 = vgg13_bn()print(net13)六 總結
1.在本文中主要介紹了VggNet網絡結構以及各層的使用情況。
2.總結了VggNet網絡結構的優缺點 。
3.提供了示例代碼。
本人水平有限,文章有寫的不對的地方歡迎各位指出!!!
總結
以上是生活随笔為你收集整理的VggNet网络结构详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8.2学长讲解(数论入门)
- 下一篇: 已测试:网上大神写的快手极速版脚本,au