日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

PyTorch之VGG16网络结构详解以及源码解读

發(fā)布時(shí)間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch之VGG16网络结构详解以及源码解读 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

論文:Very Deep Convolutional Networks for Large-Scale Image Recognition

  • 簡(jiǎn)單介紹
    意義: 證明了增加小卷積核的個(gè)數(shù)以及網(wǎng)絡(luò)深度可以提高分類結(jié)果的正確率。
    預(yù)處理: 各通道減去RGB在訓(xùn)練集上的均值。
    特點(diǎn):
    1)使用小的卷積核(3 × 3)疊加的形式代替大的卷積核(5 × 5 or 7 × 7)
    2)卷積層不會(huì)改變layer大小,而是通過(guò)max pooling減小layer大小
    3)網(wǎng)絡(luò)層數(shù)比較深
    優(yōu)點(diǎn):
    1)網(wǎng)絡(luò)結(jié)構(gòu)簡(jiǎn)潔:整個(gè)網(wǎng)絡(luò)都使用了同樣大小的卷積核(3x3)和最大池化尺寸(2x2)
    2)使用小的卷積核疊加的形式代替大的卷積核,表達(dá)能力更強(qiáng),網(wǎng)絡(luò)性能更佳
    缺點(diǎn):
    1)網(wǎng)絡(luò)參數(shù)比較多,訓(xùn)練時(shí)間過(guò)長(zhǎng),調(diào)參難度大。
    2)需要的存儲(chǔ)容量大,不利于部署。例如存儲(chǔ)VGG16權(quán)重值文件的大小為500多MB。
    其中需要說(shuō)明的是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ù)字代表的是對(duì)應(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_url

    2)所有的網(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表示對(duì)應(yīng)的所有卷積以及池化層,avgpool表示平均池化(池化分為平均池化以及最大池化),classifier表示全連接層,共三層,_initialize_weights函數(shù)表示對(duì)網(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è)卷積層對(duì)應(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网络结构详解以及源码解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。