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

article/2025/5/8 18:44:06

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

  1. 简单介绍
    意义: 证明了增加小卷积核的个数以及网络深度可以提高分类结果的正确率。
    预处理: 各通道减去RGB在训练集上的均值。
    特点:
    1)使用小的卷积核(3 × 3)叠加的形式代替大的卷积核(5 × 5 or 7 × 7)
    2)卷积层不会改变layer大小,而是通过max pooling减小layer大小
    3)网络层数比较深
    优点:
    1)网络结构简洁:整个网络都使用了同样大小的卷积核(3x3)和最大池化尺寸(2x2)
    2)使用小的卷积核叠加的形式代替大的卷积核,表达能力更强,网络性能更佳
    缺点:
    1)网络参数比较多,训练时间过长,调参难度大。
    2)需要的存储容量大,不利于部署。例如存储VGG16权重值文件的大小为500多MB。
    其中需要说明的是2个3 x 3的卷积核是可以代替一个5 x 5的卷积核的,其示意图如下:
    在这里插入图片描述

  2. 网络结构
    在这里插入图片描述
    其网络结构图如上图所示,均还有5个block,其中VGG系列包含了vgg11、vgg13、vgg16以及vgg19,其中后面的数字代表的是对应的网络结构中卷积层和全连接层的数量,例如vgg16中含有13个卷积层和3个全连接层。其中vgg11中的LRN(Local Response Normalization)表示局部响应归一化。

  3. 源码讲解
    首先要在电脑中安装torchvision,其源码可在torchvision下的models文件夹中找到,名为vgg.py
    torchvision是pytorch框架中一个非常重要且好用的包,该包主要由三个子包组成,分别是:
    torchvision.datasets;
    torchvision.models;
    torchvision.transforms

1)导入相应的包

import torch
import torch.nn as nn
from .utils import load_state_dict_from_url

2)所有的网络名称及其预训练好的参数文件

__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表示对应的所有卷积以及池化层,avgpool表示平均池化(池化分为平均池化以及最大池化),classifier表示全连接层,共三层,_initialize_weights函数表示对网络参数进行初始化

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)该函数表示添加相应的卷积层以及池化层,其中nn.Sequential表示一个有序的容器,神经网络模块将按照在传入nn.Sequential的顺序依次被添加到计算图中执行。

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,其中数字表示一个卷积层对应的输出通道数, ’ 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网络接口

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

文章来源:https://blog.csdn.net/qq_34600424/article/details/112671359
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://chatgpt.dhexx.cn/article/49fSw2WO.shtml

相关文章

VGG-16网络结构

一、VGG-16网络框架介绍 VGGNet是牛津大学计算机视觉组&#xff08;Visual Geometry Group&#xff09;和Google DeepMind公司的研究员一起研发的深度卷积神经网络。 VGGNet探索了卷积神经网络的深度与其性能之间的关系&#xff0c;通过反复堆叠33的小型卷积核和22的最大池化层…

[VGG16]——网络结构介绍及搭建(PyTorch)

一、VGG16的结构层次 VGG16总共有16层&#xff0c;13个卷积层和3个全连接层&#xff0c;第一次经过64个卷积核的两次卷积后&#xff0c;采用一次pooling&#xff0c;第二次经过两次128个卷积核卷积后&#xff0c;采用pooling&#xff1b;再经过3次256个卷积核卷积后。采用pooli…

VGG预训练模型网络结构详解——以VGG16为例

VGG卷积神经网络是牛津大学在2014年提出来的模型。当这个模型被提出时&#xff0c;由于它的简洁性和实用性&#xff0c;马上成为了当时最流行的卷积神经网络模型。它在图像分类和目标检测任务中都表现出非常好的结果。在2014年的ILSVRC比赛中&#xff0c;VGG 在Top-5中取得了92…

卷积神经网络模型之——VGG-16网络结构与代码实现

文章目录 VGGNet简介VGG16网络结构使用pytorch搭建VGG16featuresclassifier完整代码 VGGNet简介 VGG原文&#xff1a;Very deep convolutional networks for large-scale image recognition&#xff1a;https://arxiv.org/pdf/1409.1556.pdf VGG在2014年由牛津大学Visual Geom…

关于VGGNet网络结构浅谈(主要是VGG16结构)

文章目录 1.首先看一下论文中一张表&#xff1a;2.VGG16网络结构解释&#xff1a;3.网络构成详解&#xff1a;4.VGG16使用的卷积核大小都是3x3的&#xff0c;使用比之前小的卷积核有什么作用&#xff1a;5.Tensorflow2.6.0实现VGG16网络结构&#xff1a; 1.首先看一下论文中一张…

深度学习之学习(1-1) VGG16网络结构详解

参见 ​​​​​​【深度学习】全面理解VGG16模型_florrie-CSDN博客_vgg16模型介绍深度学习-VGG16原理详解_£的博客-CSDN博客_vgg16 1、网络结构 根据卷积核大小和卷积层数&#xff0c;VGG共有6中配置&#xff0c;分别为A,A-LRN,B,C,D,E&#xff0c;其中D和E两种最为常…

【深度学习】全面理解VGG16模型

全面理解VGG16模型 VGG16的结构层次介绍结构图VGG16模型所需要的内存容量介绍卷积中的基本概念1.从input到conv1&#xff1a;2.从conv1到conv2之间的过渡&#xff1a;3.conv2到conv3&#xff1a;4.进入conv3&#xff1a;5.从conv3到conv4之间的过渡&#xff1a;6.最后到三层全连…

经典卷积神经网络---VGG16详解

一.VGG概述 VGGNet是牛津大学视觉几何组(Visual Geometry Group)提出的模型&#xff0c;该模型在2014ImageNet图像分类与定位挑战赛 ILSVRC-2014中取得在分类任务第二&#xff0c;定位任务第一的优异成绩。VGGNet突出的贡献是证明了很小的卷积&#xff0c;通过增加网络深度可以…

SpringCloud笔记

Eureka 一、不引入Eureka时 1.引入公共模块依赖 <!-- 引入公共模块依赖 --> <dependency><groupId>niit</groupId><artifactId>springcloud-api</artifactId> </dependency>引入后会发现Maven视图报错&#xff0c;此处需要在父工…

服务链路追踪怎么搞?好搞吗?

微服务架构是一个分布式架构&#xff0c;它按业务划分服务单元&#xff0c;一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0c;业务的复杂性&#xff0c;如果出现了错误和异常&#xff0c;很难去定位。主要体现在&#xff0c;一个请求可能需要调用很多个服…

java小白进阶之基础篇

JAVA基础语法归纳>>小白进阶~~java基础语法 >>Java概述 Java语言的发展历史 1991年出现&#xff0c;1995年正式发布 创始人&#xff1a;James Gosling 出生地&#xff1a;SUN 被Oracle公司在这里插入代码片 最新的JDK的版本&#xff1a; 2020年发布JDK14 Java体系…

WAF绕过总结+工具介绍

什么是WAF Waf是web应用防火墙&#xff08; Web Application Firewa‖l&#xff09;的简称&#xff0c;对来自Web应用程序客户端的各类请求进行内容检测和验证&#xff0c;确保其安全性与合法性&#xff0c;对非法的请求予以实时阻断&#xff0c;为web应用提供防护&#xff0c…

Java基础入门笔记(看到就是赚到)

一、初始java 1. 生活中的程序&#xff1a; 从起床到上班的过程 穿衣打扮—起床—洗漱—吃饭—出门—乘坐交通工具—到公司 2.计算机中的程序: 一组有序指令的集合,需要和计算机交流就要使用计算机语言&#xff0c;java就是计算机语言的一种 3.java能做什么&#xff1a; …

vue-plugin-hiprint vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用

vue-plugin-hiprint vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用 安装相关依赖安装 vue-plugin-hiprintJQuery安装 打印客户端 引入依赖打印 html 内容 - 简单使用根据模版打印 - 简单使用以下内容 和上面demo 没关系 &#xff01;&#xff01;&#xff01…

Kafka问题整理 (Too many open files等)/kafka重要参数总结

1.Kafka集群搭建好以后&#xff0c;运行一段时间Kafka节点挂掉&#xff0c;程序中出现如下错误 ERROR Error while accepting connection (kafka.network.Acceptor) java.io.IOException: Too many open files 或者 ERROR Error while deleting the clean shutdown file in…

picoCTF,Reverse Engineering,逆向类,42/55

picoCTF&#xff0c;Reverse Engineering&#xff0c;42/55 2019 picoCTF01、vault-door-training&#xff0c;50分02、vault-door-1&#xff0c;100分03、vault-door-3&#xff0c;200分04、vault-door-4&#xff0c;250分05、vault-door-5&#xff0c;300分06、vault-door-6&…

Java学习(12)(String类、String的查找方法、字符串转化、 替换、拆分、截取、trim方法、字符串的不可变性、StringBuilder和StringBuffer)

接上次博客&#xff1a;Java学习&#xff08;11&#xff09;&#xff1a;Java实现图书馆书库管理系统_di-Dora的博客-CSDN博客 目录 String类 构造字符串的方法&#xff1a; String 对象的比较 1、比较是否引用了同一个对象。 2、比较字符串内容是否相同 3、"int co…

渗透测试工具实战技巧合集

本文为作者总结自己在渗透测试中常用的一些小技巧。原文分为两部分&#xff0c;译者将其合二为一&#xff0c;方便大家查阅。 最好的 NMAP 扫描策略 # 适用所有大小网络最好的 nmap 扫描策略# 主机发现&#xff0c;生成存活主机列表 $ nmap -sn -T4 -oG Discovery.gnmap 192.1…

Netty堆外内存泄漏排查,这一篇全讲清楚了

上篇文章介绍了Netty内存模型原理&#xff0c;由于Netty使用不当会导致堆外内存泄漏&#xff0c;网上关于这方面的资料比较少&#xff0c;所以写下这篇文章&#xff0c;基于Netty4.1.43.Final&#xff0c;专门介绍排查Netty堆外内存相关的知识点&#xff0c;诊断工具&#xff0…

分支选择结构

分支语句又被称为选择结构&#xff0c;选择结构就是根据一个boolean表达式,来决定执行哪一些代码(代码块)。比较常见的分支语句有if语句和switch语句&#xff0c;下面将以代码的形式说明if和switch语句的基本构成以及其作用。 1、if语句&#xff1a;if语句作为选择语句&#xf…