PyTorch之VGG16网络结构详解以及源码解读
論文:Very Deep Convolutional Networks for Large-Scale Image Recognition
簡單介紹
意義: 證明了增加小卷積核的個(gè)數(shù)以及網(wǎng)絡(luò)深度可以提高分類結(jié)果的正確率。
預(yù)處理: 各通道減去RGB在訓(xùn)練集上的均值。
特點(diǎn):
1)使用小的卷積核(3 × 3)疊加的形式代替大的卷積核(5 × 5 or 7 × 7)
2)卷積層不會(huì)改變layer大小,而是通過max pooling減小layer大小
3)網(wǎng)絡(luò)層數(shù)比較深
優(yōu)點(diǎn):
1)網(wǎng)絡(luò)結(jié)構(gòu)簡潔:整個(gè)網(wǎng)絡(luò)都使用了同樣大小的卷積核(3x3)和最大池化尺寸(2x2)
2)使用小的卷積核疊加的形式代替大的卷積核,表達(dá)能力更強(qiáng),網(wǎng)絡(luò)性能更佳
缺點(diǎn):
1)網(wǎng)絡(luò)參數(shù)比較多,訓(xùn)練時(shí)間過長,調(diào)參難度大。
2)需要的存儲(chǔ)容量大,不利于部署。例如存儲(chǔ)VGG16權(quán)重值文件的大小為500多MB。
其中需要說明的是2個(gè)3 x 3的卷積核是可以代替一個(gè)5 x 5的卷積核的,其示意圖如下:
網(wǎng)絡(luò)結(jié)構(gòu)
其網(wǎng)絡(luò)結(jié)構(gòu)圖如上圖所示,均還有5個(gè)block,其中VGG系列包含了vgg11、vgg13、vgg16以及vgg19,其中后面的數(shù)字代表的是對應(yīng)的網(wǎng)絡(luò)結(jié)構(gòu)中卷積層和全連接層的數(shù)量,例如vgg16中含有13個(gè)卷積層和3個(gè)全連接層。其中vgg11中的LRN(Local Response Normalization)表示局部響應(yīng)歸一化。
源碼講解
首先要在電腦中安裝torchvision,其源碼可在torchvision下的models文件夾中找到,名為vgg.py
torchvision是pytorch框架中一個(gè)非常重要且好用的包,該包主要由三個(gè)子包組成,分別是:
torchvision.datasets;
torchvision.models;
torchvision.transforms
1)導(dǎo)入相應(yīng)的包
import torch import torch.nn as nn from .utils import load_state_dict_from_url2)所有的網(wǎng)絡(luò)名稱及其預(yù)訓(xùn)練好的參數(shù)文件
__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', }3)vgg類的定義,其中features表示對應(yīng)的所有卷積以及池化層,avgpool表示平均池化(池化分為平均池化以及最大池化),classifier表示全連接層,共三層,_initialize_weights函數(shù)表示對網(wǎng)絡(luò)參數(shù)進(jìn)行初始化
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.Linear(512 * 7 * 7, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, num_classes),)if init_weights:self._initialize_weights()def forward(self, x):x = self.features(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return xdef _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)4)該函數(shù)表示添加相應(yīng)的卷積層以及池化層,其中nn.Sequential表示一個(gè)有序的容器,神經(jīng)網(wǎng)絡(luò)模塊將按照在傳入nn.Sequential的順序依次被添加到計(jì)算圖中執(zhí)行。
def make_layers(cfg, 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)5)其中A、B、D、E分別表示vgg11、vgg13、vgg16以及vgg19,其中數(shù)字表示一個(gè)卷積層對應(yīng)的輸出通道數(shù), ’ M ’ 表示池化層
cfgs = {'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'], }6)下面表示不同的vgg網(wǎng)絡(luò)接口
def _vgg(arch, cfg, batch_norm, pretrained, progress, **kwargs):if pretrained:kwargs['init_weights'] = Falsemodel = VGG(make_layers(cfgs[cfg], batch_norm=batch_norm), **kwargs)if pretrained:state_dict = load_state_dict_from_url(model_urls[arch],progress=progress)model.load_state_dict(state_dict)return modeldef vgg11(pretrained=False, progress=True, **kwargs):r"""VGG 11-layer model (configuration "A") from`"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`_Args:pretrained (bool): If True, returns a model pre-trained on ImageNetprogress (bool): If True, displays a progress bar of the download to stderr"""return _vgg('vgg11', 'A', False, pretrained, progress, **kwargs)def vgg11_bn(pretrained=False, progress=True, **kwargs):r"""VGG 11-layer model (configuration "A") with batch normalization`"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`_Args:pretrained (bool): If True, returns a model pre-trained on ImageNetprogress (bool): If True, displays a progress bar of the download to stderr"""return _vgg('vgg11_bn', 'A', True, pretrained, progress, **kwargs)def vgg13(pretrained=False, progress=True, **kwargs):r"""VGG 13-layer model (configuration "B")`"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`_Args:pretrained (bool): If True, returns a model pre-trained on ImageNetprogress (bool): If True, displays a progress bar of the download to stderr"""return _vgg('vgg13', 'B', False, pretrained, progress, **kwargs)def vgg13_bn(pretrained=False, progress=True, **kwargs):r"""VGG 13-layer model (configuration "B") with batch normalization`"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`_Args:pretrained (bool): If True, returns a model pre-trained on ImageNetprogress (bool): If True, displays a progress bar of the download to stderr"""return _vgg('vgg13_bn', 'B', True, pretrained, progress, **kwargs)def vgg16(pretrained=False, progress=True, **kwargs):r"""VGG 16-layer model (configuration "D")`"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`_Args:pretrained (bool): If True, returns a model pre-trained on ImageNetprogress (bool): If True, displays a progress bar of the download to stderr"""return _vgg('vgg16', 'D', False, pretrained, progress, **kwargs)def vgg16_bn(pretrained=False, progress=True, **kwargs):r"""VGG 16-layer model (configuration "D") with batch normalization`"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`_Args:pretrained (bool): If True, returns a model pre-trained on ImageNetprogress (bool): If True, displays a progress bar of the download to stderr"""return _vgg('vgg16_bn', 'D', True, pretrained, progress, **kwargs)def vgg19(pretrained=False, progress=True, **kwargs):r"""VGG 19-layer model (configuration "E")`"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`_Args:pretrained (bool): If True, returns a model pre-trained on ImageNetprogress (bool): If True, displays a progress bar of the download to stderr"""return _vgg('vgg19', 'E', False, pretrained, progress, **kwargs)def vgg19_bn(pretrained=False, progress=True, **kwargs):r"""VGG 19-layer model (configuration 'E') with batch normalization`"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`_Args:pretrained (bool): If True, returns a model pre-trained on ImageNetprogress (bool): If True, displays a progress bar of the download to stderr"""return _vgg('vgg19_bn', 'E', True, pretrained, progress, **kwargs)參考鏈接:https://zhuanlan.zhihu.com/p/41423739
總結(jié)
以上是生活随笔為你收集整理的PyTorch之VGG16网络结构详解以及源码解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于android的电影售票APP,基于
- 下一篇: 如何学好密码学