VGG16 -19 — CV 中表现最好的 ConvNet 模型

news2025/8/8 10:46:07

从先进的计算机视觉出现的 Alexnet 开始,人们开始尝试不同的架构。牛津大学工程科学系的 Karen simonyan 和 Andrew Zisserman 在对 ImageNet Challenge 2014 的数据集进行了一些实验后提出了非常深的卷积网络:VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION

引言

VGG16 是一种 CNN(卷积神经网络),被认为是迄今为止最好的计算机视觉模型之一。该模型的创建者评估了网络结构并使用具有非常小 (3 × 3) 卷积滤波器的架构增加了深度,这显示出对现有技术配置的显著改进。他们将深度推到了 16-19 个权重层,使其大约有“1.38 亿”个可训练参数。VGG16 可用于目标检测和分类,能够对 1000 个不同类别的图像进行分类,且易于与迁移学习搭配使用。

VGG-16 的架构

834f51cd0deb6acc94201babcf7b7842.png

  • VGG16中的16指的是有16的带权重的层。在 VGG16 中有 13 个卷积层、5 个 Max Pooling 层和 3 个 Dense 层,总计 21 个层,但它只有 16 层有权重,即可学习参数层。

  • VGG16 将输入图像大小设置为 224、244 和 3 个 RGB 通道

  • VGG16 最独特的地方在于,他们没有使用大量的超参数,而是专注于具有非常小尺寸(stride 为 1 - 3*3 滤波器)的卷积层,并且始终使用stride 为2 - 2*2 滤波器进行“SAME”填充和最大池化操作。

  • Conv-1 层有 64 个滤波器,Conv-2 有 128 个滤波器,Conv-3 有 256 个滤波器,Conv 4 和 Conv 5 有 512 个滤波器。

  • 三个全连接 (FC) 层跟在一堆卷积层之后:前两个层各有 4096 个通道;第三个执行 1000 个 ILSVRC 类别分类,因此包含 1000 个通道(每个类一个);最后一层是 softmax 层。

  • 在每一层之后,他们添加了 ReLU 激活函数,该函数“负责”避免梯度消失,因为它不会同时激活所有神经元。

原始研究论文中的表格

随着更多层的添加(添加的层以粗体显示),配置的深度从左 (A) 到右 (E) 增加。卷积层参数表示为“convhreceptive field sizei-hnumber of channelsi”。为简洁起见,未写出 ReLU 激活函数。

8458678a51d5e13a208b62022d17a96a.png

24f84e9638ac56a49362e8d54aaa4b6e.png

参数数量(百万)

下面是我在 FER 2013 数据集上基于 VGG-16 的项目 ——“面部情绪检测”,输入图像的大小为 48*48*1 ,将其分类为 7 类(情绪)。

def FER_vgg16_model(input_shape=(48, 48, 1)):
   visible = Input(shape=input_shape, name='input')
   num_classes = 7


   # 1stblock with 2 conv
   conv1_1 = Conv2D(64, kernel_size=3, activation='relu',          padding='same', name='conv1_1')(visible)
   conv1_1 = BatchNormalization()(conv1_1)
   conv1_2 = Conv2D(64, kernel_size=3, activation='relu', padding='same', name='conv1_2')(conv1_1)
   conv1_2 = BatchNormalization()(conv1_2)
   pool1_1 = MaxPooling2D(pool_size=(2, 2), name='pool1_1')(conv1_2)
   drop1_1 = Dropout(0.3, name='drop1_1')(pool1_1)


   # the 2-nd block with 2 conv
   conv2_1 = Conv2D(128, kernel_size=3, activation='relu', padding='same', name='conv2_1')(drop1_1)
   conv2_1 = BatchNormalization()(conv2_1)
   conv2_2 = Conv2D(128, kernel_size=3, activation='relu', padding='same', name='conv2_2')(conv2_1)
   conv2_2 = BatchNormalization()(conv2_2)
   pool2_1 = MaxPooling2D(pool_size=(2, 2), name='pool2_1')(conv2_2)
   drop2_1 = Dropout(0.3, name='drop2_1')(pool2_1)


   # the 3-rd block with 3 conv
   conv3_1 = Conv2D(256, kernel_size=3, activation='relu', padding='same', name='conv3_1')(drop2_1)
   conv3_1 = BatchNormalization()(conv3_1)
   conv3_2 = Conv2D(256, kernel_size=3, activation='relu', padding='same', name='conv3_2')(conv3_1)
   conv3_2 = BatchNormalization()(conv3_2)
   conv3_3 = Conv2D(256, kernel_size=3, activation='relu', padding='same', name='conv3_3')(conv3_2)
   conv3_3 = BatchNormalization()(conv3_3)
   pool3_1 = MaxPooling2D(pool_size=(2, 2), name='pool3_1')(conv3_3)
   drop3_1 = Dropout(0.3, name='drop3_1')(pool3_1)


   # the 4-rd block with 3 conv
   conv4_1 = Conv2D(512, kernel_size=3, activation='relu', padding='same', name='conv4_1')(drop3_1)
   conv4_1 = BatchNormalization()(conv4_1)
   conv4_2 = Conv2D(512, kernel_size=3, activation='relu', padding='same', name='conv4_2')(conv4_1)
   conv4_2 = BatchNormalization()(conv4_2)
   conv4_3 = Conv2D(512, kernel_size=3, activation='relu', padding='same', name='conv4_3')(conv4_2)
   conv4_3 = BatchNormalization()(conv4_3)
   pool4_1 = MaxPooling2D(pool_size=(2, 2), name='pool4_1')(conv4_3)
   drop4_1 = Dropout(0.2, name='drop4_1')(pool4_1)


   # the 5-rd block with 3 conv
   conv5_1 = Conv2D(512, kernel_size=3, activation='relu', padding='same', name='conv5_1')(drop4_1)
   conv5_1 = BatchNormalization()(conv5_1)
   conv5_2 = Conv2D(512, kernel_size=3, activation='relu', padding='same', name='conv5_2')(conv5_1)
   conv5_2 = BatchNormalization()(conv5_2)
   conv5_3 = Conv2D(512, kernel_size=3, activation='relu', padding='same', name='conv5_3')(conv5_2)
   conv5_3 = BatchNormalization()(conv5_3)
   pool5_1 = MaxPooling2D(pool_size=(2, 2), name='pool5_1')(conv5_3)
   drop5_1 = Dropout(0.2, name='drop5_1')(pool5_1)


   # Flatten and output
   flatten = Flatten(name='flatten')(drop5_1)
   FC1 = Dense(4096, activation="relu", name='FullyConnected1')(flatten)
   drop6_1 = Dropout(0.1, name = 'drop6_1')(FC1)
   FC2 = Dense(4096, activation="relu", name='FullyConnected2')(drop6_1)
   drop7_1 = Dropout(0.1, name='drop7_1')(FC2)
   FC3 = Dense(1000, activation="relu", name='FullyConnected3')(drop7_1)
   drop8_1 = Dropout(0.1, name='drop8_1')(FC3)
   ouput = Dense(num_classes, activation='softmax', name='output')(drop8_1)


   # create model
   model = Model(inputs=visible, outputs=ouput)


   return model

对于每个卷积层:

Filter = 3*3

Stride = 1

Padding = same

对于每个最大池化层:

Filter = 2*2

Stride= 2

Alexnet 存在的问题

它的层数较少,因此无法提取比较深层的特征。此外,他们在每一层中选择固定滤波器的数目和步幅进行卷积和池化操作。

VGG-16 相对于 Alexnet 的优势

  • 在每个卷积层中,滤波器的 size 为 3*3,stride为 1,使用“same”的方式进行填充,最大池化层的 size 为2*2,stride 为2。

  • 由于 VGG-16 是相对比较深层的神经网络,它将从图像中提取更多特征,而且梯度消失的问题在 ReLU 激活函数的加入后得到了有效的解决。

  • VGG-16 是一个“系统的”神经网络,它具有相同的步长和滤波器,每个模块独立地进行卷积和池化操作。

  • vgg-16 和 vgg-19 之间的区别是 vgg-19 多了 3 个卷积层,这使得它的性能比 vgg16 好一些。

·  END  ·

HAPPY LIFE

af5887c48c602bd533c21c5aec1101d1.png

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

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

相关文章

美食杰项目(二)首页

目录前言具体样式代码思路加载样式相应组件相应代码总结:前言 本节给大家讲的是美食杰项目的首页的主要功能和具体样式 具体样式 代码思路 1.点击首页跳转到首页页面 2.在父组件将轮播图所需的图片请求出来,再传给轮播组件 3.在父组件将商品列表的数据…

找不到工作,软件测试真的不香了?

最近总是有人说测试先不要干,测试不好找工作。测试没有以前那么香了? 可是,这是真的么?什么样的人会说这样的话? 肯定不是现在还在岗的人说的,也不是已经拿到企业聘用offer的人说的。 因为他们都是优秀的…

交换机的工作原理以及搭建局域网划分VLAN

作者简介:一名99年软件运维应届毕业生,正在自学云计算课程。宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。创作不易,动动小手…

OneAuth 2022.11.23版本更新内容

2022.11.23版本更新内容: 新增IdP飞书 云目录增加对Group的支持GWA浏览器插件适配性优化自定义授权服务器优化,适应RBAC、ABAC等多种场景授权IdP 北森优化,适配自定义的属性租户的部分试用功能需要联系后台开通其他一些Bug的修复 标题新增 …

GIT

X.1 git上线后同步分支代码 上线后合并远端开发分支到远端master: 本地分支提交到远端分支,git上远端分账合并请求到远端master 上线后合并远端master到远端开发分支: 同步远端master到本地master,将本地master合并到本地开发分…

DM8级联异步备库搭建及故障模拟将异步切换为实时同步

目录 一、 搭建前准备 二、 主库配置 2.1 dmini配置 2.2 dmmal.ini配置 2.3 dmarch.ini配置 2.4 dmwatcher.ini配置 2.5 dmtimer.ini配置 三、 异步备库配置 3.1 dm.ini配置 3.2 dmmal.ini配置 3.3 dmarch.ini配置 3.4 dmwatcher.ini配置 3.5 dmtimer.ini配置 四、…

【计算机网络】HTTP/HTTPS协议基础知识汇总

目录 1.URL: 2.HTTP协议: 2.1抓包工具(这里用fiddler): 2.2请求和响应的格式: 2.3方法的介绍: 2.4请求报头(header): 2.5状态码: 2.6响应…

格式化DataFrame中的时间数据DataFrame.to_datetime()方法

小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 格式化DataFrame中的时间数据 DataFrame.to_datetime()方法 选择题 关于以下python代码说法错误的一项是? import pandas as pd data {"Date": [2022/12/01,2022/12/02]} df pd…

SQL Server如何获取GUID号

select newid() guid;--获取GUID select replace(newid(),-,) guid;--获取GUID 去掉- sqlserver newid()函数 NEWID (Transact-SQL) - SQL Server | Microsoft LearnNEWID (Transact-SQL)https://learn.microsoft.com/en-us/sql/t-sql/functions/newid-transact-sql?redirect…

在大厂工作是这样的

应上面的一个小伙伴要求,让一个朋友整理了他做华为的工作经历,写的有些零散,希望对有大公司情怀的人所有帮助。35岁那年,拿到华为的社招offer。看着邮箱里面的录取通知,心里有高兴也有失落,难受的是看着身边…

腾讯云COS+PicGo+Typora十分钟搭建自己的图床

👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 常见软件安装与运用 ❤️ 支持我:👍点赞…

[附源码]java毕业设计逸尘房屋销售管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

SSRF 漏洞笔记

什么是 SSRF 漏洞 SSRF(Server-Side Request Forgery,服务端请求伪造)是指攻击者向服务端发送包含恶意 URL 链接的请求,借由服务端去访问此 URL ,以获取受保护网络内的资源的一种安全漏洞。SSRF 常被用于探测攻击者无…

引擎入门 | Unity UI简介–第1部分(9)

本期我们继续为大家进行Unity UI简介(第一部分)的后续教程 本篇内容 21.增加设置按钮 22.添加场景构建 文章末尾可免费获取教程源代码 本篇Unity UI简介(第一部分)篇幅较长,分为十篇,本篇为第九篇。 …

RK3568平台开发系列讲解(视频篇)视频编码的工作原理

🚀返回专栏总目录 文章目录 一、编码标准介绍二、编码器的工作编码原理介绍2.1、帧类型介绍2.2、消除时间上的冗余信息2.3、消除空间上的冗余信息沉淀、分享、成长,让自己和他人都能有所收获!😄 📢采集下来的内容最终是需要保存到一个视频文件中的,所以就需要用到视频…

折叠屏“世界杯”开哨,荣耀Magic Vs踢出关键一球

已经开幕的卡塔尔世界杯,点燃了全世界球员们的激情和球迷们的热情。有人关注比赛输赢结果,也有人在乎的是运动员高超的技法、球队成员的紧密配合、精彩的战略战术。折叠屏市场从2019元年至今,也来到了关键赛点。一方面,除苹果外重…

【零基础入门SpringMVC】第二期——匹配请求与获取请求参数

一、RequestMapping注解 该注解有什么作用呢? 将请求和处理请求的控制器方法关联起来 ,建立映射关系当SpringMVC接收到指定的请求后,就会通过映射关系中对应的控制器方法处理请求 我们可以查看一下该注解的源码: // // Source …

MyBatis-Plus之DQL编程控制

增删改查四个操作中,查询是非常重要的也是非常复杂的操作,本次介绍的有: 条件查询方式查询投影查询条件设定字段映射与表名映射 1. 条件查询 1.1 条件查询的类 MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完…

Docker的镜像管理

Docker的镜像管理Docker的镜像管理一、Docker的镜像管理命令1.1 搜索镜像1.2 获取镜像1.3 镜像加速下载1.4 查看镜像信息1.5 获取镜像详细信息1.6 为本地的镜像添加新的标签1.7 删除镜像1.8 批量删除镜像1.8 存出镜像:将镜像保存成为本地文件1.9 载入镜像&#xff1…

如何用人工智能帮你剪视频?

痛点制作视频已经好几年了,但是剪片子一直是让我比较头疼的事儿。以前我一直搞不清楚,视频为什么需要剪辑。曾经有一段儿,我是这么录视频的。如果讲的时候出现了磕绊,或者有些展示过程出现问题,我怎么办?我…