VGG16模型详解

news2024/11/15 5:48:27

VGG16模型详解

0、VGG16介绍

VGG16是一种深度卷积神经网络,由牛津大学的研究团队于2014年开发。

VGG16在2014年的ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 竞赛中取得了显著的成绩。它在图像分类任务中获得了当年的第二名,其准确率超过了之前的深度神经网络模型,并为后来的研究提供了重要的启示。

1、网络模型结构

这张图来源于论文《VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE            IMAGE RECOGNITION》,其中的D、E就表示的是VGG16和VGG19。

parameters:

  • input(224x224 RGB image):输入尺寸为224x224的RGB彩色图片。
  • conv3-64:前一个数字表示卷积核的大小,后一个数字表示卷积核的数量。其它的也如此。
  • maxpool:最大池化,有助于提取主要特征、降低维度、增加不变性。
  • FC-4096-1:全连接(Fully Connected)层,具体指的是包含4096个神经元的全连接层。将来自卷积和池化层的特征映射进行扁平化,然后与权重矩阵相乘并加上偏置,产生一组4096维的输出。
  • FC-4096-2:这是VGG16网络的第二个全连接层,同样具有4096个神经元。它接收来自第一个全连接层的4096维输出作为输入,然后进行相同的矩阵相乘和偏置操作,得到最终的特征表示。
  • FC-1000:最后一个全连接层是FC-1000,它有1000个神经元,对应于ImageNet数据集中的1000个类别(即网络被训练用于ImageNet图像分类任务)。这一层的输出经过softmax激活函数后,表示图像属于每个类别的概率分布,从而实现了分类功能。

2、VGG16的卷积核特点

VGG网络的卷积层全部采用的是3x3卷积核,这个设计是VGG16网络的一个显著特点。一个3x3卷积核包含了一个像素的上下左右的最小单元。连续多层的3x3卷积核可以拟合更复杂的特征,同时增加网络深度。

两个3x3卷积可以替代一个5x5卷积,三个3x3卷积可以替代一个7x7卷积。这样多个小卷积核的卷积层替代一个卷积核较大的卷积层,一方面参数数量减少了,另一方面非线性次数也变多了,学习能力变得更好,网络的表达能力也提升了。

3、网络卷积过程

图片来源于同济子豪兄的视频。

  • 输入尺寸为224x224x3的RGB图像,经过block1,步长为1,padding=1的填充。经过两个卷积层后,再经过ReLU函数激活,尺寸不变,通道数为64。尺寸变为224x224x64。
  • 每经过maxpool,滤波器大小为2x2,步长为2,尺寸减半。尺寸变为112x112x64。
  • 经过block2,两次卷积,ReLU激活。尺寸变为112x112x128。
  • maxpool池化,尺寸变为56x56x128。
  • 经过block3,三次卷积,ReLU激活。尺寸变为56x56x256。
  • maxpool池化,尺寸变为28x28x256。
  • 经过block4,三次卷积,ReLU激活。尺寸变为28x28x512。
  • maxpool池化,尺寸变为14x14x512。
  • 经过block5,三次卷积,ReLU激活。尺寸变为14x14x512。
  • maxpool池化,尺寸变为7x7x512。
  • 然后Flatten(),变成一维512*7*7=25088。
  • 经过两层1x1x4096,一层1x1x1000的全连接层(共三层),经ReLU激活。
  • 最后通过softmax输出1000个预测结果。

4、查看Pytorch内置的VGG16模型

import torch
import torchvision
import torch.nn as nn
import torchsummary

# pytorch内置的VGG16的模型
model = torchvision.models.vgg16()
print(model)

控制台部分内容:

5、内置模型的参数量

import torch
import torchvision
import torch.nn as nn
import torchsummary

model = torchvision.models.vgg16()
torchsummary.summary(model,input_size=(3,244,244),batch_size=2,device='cpu')

控制台部分内容:

部分参数量 

Total params: 138,357,544

总的参数量达到了1.38亿。VGG16具有如此之大的参数数目,可以预期它具有很高的拟合能力,但同时缺点也很明显,即训练时间过长,调参难度大。需要的存储容量大,不利于部署。

6、使用Pytorch实现VGG16

class VGG16(nn.Module):
    """
    每个卷积核大小都是3x3,后面步长为1,padding=1
    每个卷积后面都用了ReLU
    """
    def __init__(self,in_channel=3,out_channel=1000,num_hidden=512*7*7):
        super(VGG16,self).__init__()
        self.features=nn.Sequential(
            # block1
            nn.Conv2d(in_channel,64,(3,3),(1,1),1),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),

            nn.MaxPool2d(2,2),

            # block2
            nn.Conv2d(64, 128, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(128, 128, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),

            nn.MaxPool2d(2, 2),

            # block3
            nn.Conv2d(128, 256, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),

            nn.MaxPool2d(2, 2),

            # block4
            nn.Conv2d(256, 512, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),

            nn.MaxPool2d(2, 2),

            # block5
            nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
            nn.ReLU(inplace=True),

            nn.MaxPool2d(2, 2),
        )
        self.avgpool = nn.AdaptiveAvgPool2d(output_size=(7,7))
        self.classifier = nn.Sequential(
            nn.Linear(num_hidden, 4096),
            nn.ReLU(),
            nn.Dropout(),

            nn.Linear(4096, 4096),
            nn.ReLU(),
            nn.Dropout(),

            nn.Linear(4096, out_channel),
        )
    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

上面均为仿照Pytorch内置的VGG16模型的参数编写的。

7、总结

VGG16作为深度学习发展历程中的重要里程碑,强调了通过增加网络深度和一致性设计来提取图像特征。它的成功启发了后续更复杂的网络架构和方法,并在图像分类等任务中取得了重要成就。通过研究和实践,我们可以更好地理解VGG16的原理,并将其应用于实际问题中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java可执行命令】(二十一)线程快照生成工具 jstack:帮助开发人员分析和排查线程相关问题(死锁、死循环、线程阻塞...)

Java可执行命令之jstack 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 使用步骤及技巧3.3 使用案例 4️⃣ 应用场景🌾 总结 1️⃣ 概念 jstack 命令是 Java Development Kit(JDK)中提供的一项诊断工具,用于生成Java虚拟…

震坤行工业超市旗下震坤行智能制造(苏州)有限公司开工奠基仪式圆满成功

震坤行工业超市旗下震坤行智能制造(苏州)有限公司开工奠基仪式圆满成功 2023年7月3日,震坤行工业超市于太仓港经济技术开发区举行了震坤行智能制造(苏州)有限公司项目奠基动工仪式。震坤行董事长兼CEO陈龙&#xff0c…

基于OFDM通信系统的低复杂度的资源分配算法matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .......................................................................%子载波分配[~,po…

Grafana技术文档-概念-《十分钟扫盲》

Grafana官网链接 Grafana: The open observability platform | Grafana Labs 基本概念 Grafana是一个开源的度量分析和可视化套件,常用于对大量数据进行实时分析和可视化。以下是Grafana的基本概念: 数据源(Data Source)&#…

idea+gradle阅读spring5.2.9源码之源码构建报错解决方案

注意 1、先确保gradle版本和spring、jdk版本对应 本文:gradle:5.6.4/spring 5.2.9/jdk1.8(gradle和jdk都要先安装好,gradle还要配置好本地资源文件路径) 2、原来项目乱了的话,先重新导入下载的源码项目 3、进入源码所在根目录&…

【iOS】autoreleasepool

来说一下最近在了解的autoreleasepool吧&#xff0c;我们可能平时书写过许多脑残代码&#xff0c;其有很多的缺陷但是我们可能当时学的比较浅就也不太了解&#xff0c;就像下面这样的&#xff1a; for (int i 0; i < 1000000; i) {NSNumber *num [NSNumber numberWithInt…

【前端 | CSS】aligin-items与aligin-content的区别

align-items 描述 CSS align-items 属性将所有直接子节点上的 align-self 值设置为一个组。align-self 属性设置项目在其包含块中在交叉轴方向上的对齐方式 align-items是针对每一个子项起作用&#xff0c;它的基本单位是每一个子项&#xff0c;在所有情况下都有效果&…

【uniapp】原生子窗体subNvue的使用与踩坑

需求 最近接到个需求, 需要在video组件上弹出弹窗, 也就是覆盖video这个原生组件 未播放时, 弹窗可以覆盖, 但是当video播放时, 写的弹窗就覆盖不了了 因为video是原生组件, 层级非常高, 普通标签是覆盖不了的, map标签同理 覆盖原生组件, 官方给出解决办法一. 使用cover-view…

文件传输软件常见问题解决办法大全

文件传输软件是我们工作中不可缺少的一种工具&#xff0c;它可以帮助我们快速、安全、稳定地传输各种文件&#xff0c;如文档、图片、视频等。但是在使用文件传输软件的过程中&#xff0c;我们也可能会遇到一些问题&#xff0c;影响我们的工作效率和传输质量。那么&#xff0c;…

【陈老板赠书活动 - 10期】- 【Python之光:Python编程入门与实战】

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。讲一些我刚进公司的学…

【ARM Cache 系列文章 9 番外篇 -- ARMv9 系列 Core 介绍】

文章目录 ARMv9 系列CoreARM Cortex-A510 介绍ARM Cortex-A715ARM Cortex-A720 ARMv9 系列Core 2021年5月Arm公布了其最新3款CPU和3款GPU核心设计&#xff0c;三款新CPU分别是旗舰核心Cortex-X2、高性能核心Cortex-A710、高能效核心Cortex-A510 CPU&#xff0c;三款新GPU核心则…

【Linux】深入探索Linux信号

目录 写在前面的话 什么是信号 生活中的信号 Linux下的信号 Linux常见信号 Core核心转储 信号如何产生 键盘组合键 1.如何理解信号被进程保存 2.如何理解信号发送的本质 通过系统调用向进程发送信号 kill() 手动实现kill指令 raise() abort()[非系统调用…

Django ORM 框架中的表关系,你真的弄懂了吗?

Django ORM 框架中的表关系 为了说清楚问题&#xff0c;我们设计一个 crm 系统&#xff0c;包含五张表&#xff1a; 1.tb_student 学生表 2.tb_student_detail 学生详情表 3.tb_salesman 课程顾问表 4.tb_course 课程表 5.tb_entry 报名表 表关系和字段如下图&#xff1a…

String 类的运用

目录 1.字符串构造 2.String对象的比较 2.1比较是否引用同一个对象 2. 2boolean equals(Object anObject) 2.3int compareTo(String s) 方法: 按照字典序进行比较 2.4int compareToIgnoreCase(String str) 3.字符串查找 4.2大小写转换 4.3字符串转数组 4.4 格式化 5.字…

java 企业工程管理系统软件源码 自主研发 工程行业适用 em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

好用的无线蓝牙耳机怎么选?七款真无线蓝牙耳机分享盘点

随着蓝牙技术的不断进步&#xff0c;近年来蓝牙耳机发展更是呈指数式上升阶段。蓝牙耳机凭借其携带便捷性以及摆脱线的缠绕而在外出必备数码产品中名列前茅&#xff0c;现如今在日常生活中随处可见的都有戴着蓝牙耳机的人&#xff0c;或是听歌、或是降噪、或是玩游戏等等&#…

分享实录 | 将 NGINX 打造成功能强大的 API 网关(上)

原文作者&#xff1a;易久平 原文链接&#xff1a;分享实录 | 将 NGINX 打造成功能强大的 API 网关&#xff08;上&#xff09; NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 大家好&#xff0c;很高兴加入此次 NGINX 深潜之旅。接下来我将给大家分享如何将 NGINX 打…

DP(状态机模型)

大盗阿福 阿福是一名经验丰富的大盗。趁着月黑风高&#xff0c;阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N 家店铺&#xff0c;每家店中都有一些现金。 阿福事先调查得知&#xff0c;只有当他同时洗劫了两家相邻的店铺时&#xff0c;街上的报警系统才会启动&#x…

Mac安装nvm教程及使用

nvm 是 node 版本管理器&#xff0c;也就是说一个 nvm 可以管理多个 node 版本&#xff08;包含 npm 与 npx&#xff09;&#xff0c;可以方便快捷的安装、切换 不同版本的 node。 1、直接通过brew安装 执行命令&#xff1a;brew install nvm PS&#xff1a; 如果没有安装br…

JDK 8 升级 JDK 17 全流程教学指南

JDK 8 升级 JDK 17 首先已有项目升级是会经历一个较长的调试和自测过程来保证允许和兼容没有问题。先说几个重要的点 遇到问题别放弃仔细阅读报错&#xff0c;精确到每个单词每一行&#xff0c;不是自己项目的代码也要点进去看看源码到底是为啥报错明确你项目引入的包&#x…