通俗易懂理解VGG网络模型

2024-01-24 17:12

本文主要是介绍通俗易懂理解VGG网络模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

温故而知新,可以为师矣!

一、参考资料

【论文阅读】VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION

一文读懂VGG网络

二、VGG网络模型

1. VGG简介

VGG是Oxford的 Visual Geometry Group的组提出的(大家应该能看出VGG名字的由来了)。

VGG首次探究了网络的深度对于网络预测精度的影响,发现使用尺寸更小的卷积核和更深的网络可以达到更好的预测精度,我们常听说的 VGG-16, VGG-19中16和19就是只网络的深度有16层和19层。VGGNet的结构非常清晰,在整个网络中使用的卷积核尺寸均为 3x3,这样做不仅能够大幅度的减少参数量,还相当于进行了更多的非线性映射,使模型的表达能力更强。

不同深度的VGG网络,全连接层的数量相同,不同的是卷积层的数量。例如,VGG-16 包含13个卷积层和3个全连接层,VGG-19则包含16个卷积层和3个全连接层。VGG-19VGG-16 多了三个卷积层,两者并没有本质上的区别,只是网络深度不一样。

VGG版本CNN层FC层
VGG1183
VGG13103
VGG16133
VGG19163

2. VGG vs AlexNet

与AlexNet(ILSVRC2012)、ZFNet(ILSVRC2013)、OverFeat(ILSVRC2013)这些已经在ILSVRC2012-2013中取得优异成绩的网络结构相比,VGG并没有在第一个卷积层就使用很大的卷积核(AlexNet在第一个卷积层使用的卷积核大小为 11×11,步长为4;ZFNet和OverFeat在第一个卷积层使用的卷积核大小为7×7,步长为2)。VGG网络全部使用 3×3 的卷积核,步长均为1,并且在输入层之后,可能连续会有多个卷积层的堆叠(中间不再pooling),这样做的效果是:当有两个卷积层堆叠时,第二个卷积层的 3×3 感受野映射到输入层就是 5×5;当有3个卷积层堆叠时,第三个卷积层的 3×3 感受野映射到输入层就是 7×7。简单理解,3个步长为1的 3x3卷积核的一层层叠加作用可看成一个大小为7的感受野,也就是说3个 3x3 连续卷积相当于一个 7x7 卷积。

将大的卷积核拆分成小的卷积核搭配多个堆叠的卷积层,这样做的好处有以下几点:

  1. 增强特征学习能力。多个堆叠的卷积层可以使用多次ReLU激活函数,相比只有一层使用一次ReLU激活函数,前者使得网络对特征的学习能力更强;
  2. 降低网络参数数量。比如,3个堆叠的卷积层搭配 3×3 的卷积核的参数数量为 3 × 3 × 3 × C × C = 27 C 2 3×3×3×C×C=27C^2 3×3×3×C×C=27C2,而一个卷积层搭配 7×7 的卷积核的参数数量为 7 × 7 × C × C = 49 C 2 7×7×C×C=49C^2 7×7×C×C=49C2,其中C表示输入数据的通道数和卷积核的个数。

5×5 的卷积核为例,可通过堆叠两个 3×3 的卷积核实现 5×5 的卷积效果,具体过程如下图所示:

在这里插入图片描述

3. VGG网络结构

vgg-16

VGG包含5个卷积块(Conv block),卷积通道数随着卷积块的增加依次变为原来的两倍,每个卷积块之后都要进行一次 max pooling 操作,网络末尾是三个全连接层。网络层次越靠后,其参数量就越大,而全连接层的参数量占整个网络的比例更高。具体的网络结构,如下图所示:

在这里插入图片描述

3.1 VGG-16网络结构

在这里插入图片描述

3.2 VGG-16输入输出尺寸

以VGG-16为例,输入图像尺寸为(3, 224, 224),则输出特征图的尺寸为:

在这里插入图片描述

4. VGG优势

  • VGGNet的结构非常简洁,整个网络都使用 3x3 的卷积和 2x2max pooling
  • 采用堆叠几个小卷积核的卷积层优于采用大卷积核的卷积层;
  • 验证了通过不断加深网络结构可以提升性能。

三、相关经验

1. (PyTorch)代码实现

github代码:vgg.py

torchvision 提供的VGG-16为例,介绍VGG代码实现,其核心代码如下:

import torch
import torch.nn as nnclass VGG(nn.Module):def __init__(self, features: nn.Module, num_classes: int = 1000, init_weights: bool = True, dropout: float = 0.5) -> None:super().__init__()_log_api_usage_once(self)self.features = features# 如果输入图像尺寸不为(3, 224, 224),则输出特征图的尺寸不为(512, 7, 7), 则采用自适应池化,使得输出特征图的尺寸变为(512, 7, 7)self.avgpool = nn.AdaptiveAvgPool2d((7, 7))  self.classifier = nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(True),nn.Dropout(p=dropout),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(p=dropout),nn.Linear(4096, num_classes),)if init_weights: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)def forward(self, x: torch.Tensor) -> torch.Tensor:x = self.features(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return xcfg = {'A': [64,     'M', 128,      'M', 256, 256,           'M', 512, 512,           'M', 512, 512,           'M'],   # 11 layers'B': [64, 64, 'M', 128, 128, 'M', 256, 256,           'M', 512, 512,           'M', 512, 512,           'M'],   # 13 layers'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256,      'M', 512, 512, 512,      'M', 512, 512, 512,      'M'],   # 16 layers out_channels for encoder, input_channels for decoder'E': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],   # 19 layers
}def make_layers(cfg: List[Union[str, int]], batch_norm: bool = False) -> nn.Sequential:layers: List[nn.Module] = []in_channels = 3for v in cfg:if v == "M":layers += [nn.MaxPool2d(kernel_size=2, stride=2)]else:v = cast(int, v)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)def _vgg(cfg: str, batch_norm: bool, weights: Optional[WeightsEnum], progress: bool, **kwargs: Any) -> VGG:if weights is not None:kwargs["init_weights"] = Falseif weights.meta["categories"] is not None:_ovewrite_named_param(kwargs, "num_classes", len(weights.meta["categories"]))model = VGG(make_layers(cfgs[cfg], batch_norm=batch_norm), **kwargs)if weights is not None:model.load_state_dict(weights.get_state_dict(progress=progress, check_hash=True))return model@register_model()
@handle_legacy_interface(weights=("pretrained", VGG16_Weights.IMAGENET1K_V1))
def vgg16(*, weights: Optional[VGG16_Weights] = None, progress: bool = True, **kwargs: Any) -> VGG:"""VGG-16 from `Very Deep Convolutional Networks for Large-Scale Image Recognition <https://arxiv.org/abs/1409.1556>`__.Args:weights (:class:`~torchvision.models.VGG16_Weights`, optional): Thepretrained weights to use. See:class:`~torchvision.models.VGG16_Weights` below formore details, and possible values. By default, no pre-trainedweights are used.progress (bool, optional): If True, displays a progress bar of thedownload to stderr. Default is True.**kwargs: parameters passed to the ``torchvision.models.vgg.VGG``base class. Please refer to the `source code<https://github.com/pytorch/vision/blob/main/torchvision/models/vgg.py>`_for more details about this class... autoclass:: torchvision.models.VGG16_Weights:members:"""weights = VGG16_Weights.verify(weights)return _vgg("D", False, weights, progress, **kwargs)

2. (TensorFlow)代码实现

VGG in TensorFlow

Tensorflow VGG16 and VGG19

四、参考文献

Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arxiv preprint arxiv:1409.1556, 2014.

这篇关于通俗易懂理解VGG网络模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640381

相关文章

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

回调的简单理解

之前一直不太明白回调的用法,现在简单的理解下 就按这张slidingmenu来说,主界面为Activity界面,而旁边的菜单为fragment界面。1.现在通过主界面的slidingmenu按钮来点开旁边的菜单功能并且选中”区县“选项(到这里就可以理解为A类调用B类里面的c方法)。2.通过触发“区县”的选项使得主界面跳转到“区县”相关的新闻列表界面中(到这里就可以理解为B类调用A类中的d方法

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

智能客服到个人助理,国内AI大模型如何改变我们的生活?

引言 随着人工智能(AI)技术的高速发展,AI大模型越来越多地出现在我们的日常生活和工作中。国内的AI大模型在过去几年里取得了显著的进展,不少独创的技术点和实际应用令人瞩目。 那么,国内的AI大模型有哪些独创的技术点?它们在实际应用中又有哪些出色表现呢?此外,普通人又该如何利用这些大模型提升工作和生活的质量和效率呢?本文将为你一一解析。 一、国内AI大模型的独创技术点 多模态学习 多

OpenCompass:大模型测评工具

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型数据侧总结大模型token等基本概念及参数和内存的关系大模型应用开发-华为大模型生态规划从零开始的LLaMA-Factor

模型压缩综述

https://www.cnblogs.com/shixiangwan/p/9015010.html