第15章 MiniVGGNet:更深的CNNs

VGGNet(或简称为VGG),第一次在文献《Very Deep Learning Convolutional Neural Networks for Large-Scale Image Recognition》提出。它们的贡献是具有非常小(3×3)的网络架构可被训练增加到很深的层次(16-19层)并且能够在ImageNet分类挑战上获得最新的分类。

之前,在深度学习文献的网络架构中使用混合核大小:CNN的第一层通常核大小为7×7或11×11,之后的层次中核大小逐渐减小到5×5,最后仅在网络的非常深的层次上使用3×3的核。

VGGNet独特的原因是它在整个网络架构中使用唯一的3×3的核。任何时候你看到一个网络架构整个都用3×3的核,你可以认为它来自于VGGNet。直接看VGGNet的整个16层或19层目前CNN的介绍来说太高深了,对于更细节的VGG16或VGG19,看ImageNet Bundle的第11章。

我们将回顾VGGNet的架构构成,且定义CNN要实现该架构必须满足的特性。之后,我们实现一个VGGNet的变种——MiniVGGNet。这个网络也将演示如何使用两个重要的层——BN层和Dropout层。

1         VGG家族

VGG家族的CNN构成主要有两个部分:

(1)所有的CONV层仅使用3×3的核;

(2)在应用POOL操作之前堆叠多个CONV=>RELU层(随着网络越深,连续的CONV=>RELU数目通常减少)。

1.1  (Mini)VGG架构

在ShallowNet和LeNet网络中我们应用了一系列CONV=>RELU=>POOL层。但是,在VGGNet中,我们在应用单个POOL层之前将堆叠多个CONV=>RELU层。这个操作允许网络在通过POOL层对输入空间尺寸做下采样之前可以从CONV层中学习到更丰富的特征。

整体上,MiniVGGNet包含CONV => RELU => CONV => RELU => POOL这样的两个集合,之后跟着FC => RELU => FC => SOFTMAX层。前两个CONV层将学习32个3×3的核。后两个CONV层将学习64个同样是3×3的核。我们的POOL层将执行2×2核、stride为2×2的max pool操作。我们也将在每个激活层之后跟着BN层并且在POOL和FC层之后跟上Dropout层。

表15.1 MiniVGGNet层次表

网络架构细节见表15.1,网络的输入大小为32×32×3,因为我们在CIFAR-10上训练网络。再次注意,我们是如何在网络架构中应用BN层和Dropout层的。应用BN层可以降低过拟合的风险并且增加分类正确率。

2         实现MiniVGGNet

根据网络蓝图如表15.1,我们使用keras库实现它。与第14章实现类似,我们在nn.conv子目录下新建minivggnet.py,作为我们MiniVGGNet的实现。且不要忘记在当前目录的__init__.py中添加导出的类名MiniVGGNet。

我们通过keras.layers.normalization import BatchNormalization,通过keras.layers.core import Dropout导入丢弃层。在定义类MiniVGGNet中,我们增加了一个变量chanDim表示通道优先顺序。因为BN层工作在通道上,我们需要该变量指明BN工作在哪个axis上。

之后的构建模型,根据蓝图一层一层构建即可,注意里面在构建POOL层时,我们用model.add(MaxPooling2D(pool_size=(2, 2)))而没有明确的指明stride的2×2大小,在keras中不指定stride时,默认stride大小等于该pool_size大小。我们还注意到model.add(Dropout(0.25))表示当前层的节点以25%的概率不连接到下一层节点上。我们第一模块的CONV层核大小为32,第二模块的CONV层核大小为64,即随着网络中越深空间输入尺寸越小,增加核的数目是很常见的操作。最后我们的FC层使用512节点,且注意到我们在两个FC层之间使用Dropout层,丢弃概率为50%,即在FC层之间通常的Dropout设置为0.5。

3         在CIFAR-10上演示MiniVGGNet

训练脚本类似于第14章的操作模式:加载CIFAR-10数据集、初始化MiniVGGNet架构、训练MiniVGGNet、评估网络性能。

我们创建minivggnet_cifar10.py的脚本,见GitHub。

我们首先导入必要的模块,这里使用matplotlib后台用AGG,表明我们将创建一个非交互性的仅保存到磁盘的结果文件,因为在一些通过ssh等远程登录的运行中,直接显示图片会造成matplotlib错误,因此这里直接使用agg作为使用,表示在训练完成后,直接把结果保存到磁盘上。

最重要的初始化优化器语句opt = SGD(lr=0.01, decay=0.01 / 40, momentum=0.9, nesterov=True),表示我们学习率α=0.01并且动量参数γ=0.9。设置nesterov=True表明我们在SGD中使用Nesterov加速。这里我们还使用一个特别的参数decay=0.01/40,用于随着时间缓慢的降低学习率参数。就像在下一章讨论的,降低学习率在降低过拟合和增加分类正确率方面很有用——学习率越小,权重更新越小。通常,decay的设置为学习率除以epoch数目。这里的epoch设置为40,初始学习率为lr=0.01,即设置decay=0.01/40。我们在评估MiniVGGNe时,采用两种方式,即一个具有BN层,另一个不具有BN层。

                                    

图15.2 具有BN层和不具有BN层损失对比图

3.1  具有BN层

我们首先在chapter15/下创建一个输入结果保存文件:output/cifar10_minivggnet_with_bn.png。然后直接执行python minivggnet_cifar10.py --output output/cifar10_minivggnet_with_bn.png即可开始训练,且将最终结果保存到该文件中。

结果如图15.2左图所示,可看到具有BN层的MiniVGGNet分类正确率大约在83%左右,这个结果要比ShallowNet的60%的分类正确率高很多。

3.2  不具有BN层

我们将nn/conv/minivggnet.py文件中的所有BN层注释掉,即获得不具有BN层的MiniVGGNet网络模型。之后我们创建保存的图片文件:output/cifar10_minivggnet_without_bn.png。然后执行python minivggnet_cifar10.py --output output/cifar10_minivggnet_without_bn.png即可重新训练不具有BN层的结果。

训练结果如图15.2右图所示。我们注意到不具有BN层的训练要比具有BN层训练的快,但是训练完成后,它的验证正确率将只有79%左右。

通过上述图对比,我们可看到BN层的影响:在不具有BN层的图表中验证损失在30epoch后将增加,这表明网络在训练数据上过拟合了。我们还看到在25epoch后,验证损失变得比较平稳了。另一方面,具有BN层的MiniVGGNet更稳定。尽管损失和精确率在35epoch之前不平稳,但是它没有过拟合。这也是为什么建议在网络中使用BN层的原因。

4         总结

本章讨论了CNNs的VGG家族。一个CNN可考虑是类VGG网络,如果(1)它不管网络多深,只使用3×3核;(2)在应用POOL层之前,堆叠多个CONV=>RELU层。

之后我们实现了一个类VGG网络——MiniVGGNet,这个网络考虑两个((CONV=>RELU)*2)=>POOL的结构,之后跟着FC => RELU => FC => SOFTMAX结构,我们也在每个激活层后跟着BN层以及在每个POOL核FC层后跟着Dropout层。

之后,我们在CIFAR-10上评估MiniVGGNet性能,结果建议在训练自己的网络时加入BN层。

原文地址:https://www.cnblogs.com/paladinzxl/p/9686017.html

时间: 2024-10-02 21:35:43

第15章 MiniVGGNet:更深的CNNs的相关文章

敏捷软件开发:原则、模式与实践——第15章 状态图

第15章 状态图 在描述有限状态机(FSM)方面,UML提供个丰富的符合. 15.1 基础知识 下图是一个简单的状态迁移图(STD),该图描述了控制用户登录到系统的FSM.圆角矩形表状态.上层格间放置每个状态的名字.下层格间中放置的是一些特定动作,表示当进入或退出该状态时要做什么. 图中左上角的实心圆称为初始伪状态.FSM从这个伪状态开始,根据变迁规则进行转移. 15.1.1 特定事件 状态图的下层格间含有事件/动作对. 15.1.2 超状态 当许多状态以同样的方式响应某些同样的事件时,使用超状

第 15 章 组合模式【Composite Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 大家在上学的时候应该都学过“数据结构”这门课程吧,还记得其中有一节叫“二叉树”吧,我们上 学那会儿这一章节是必考内容,左子树,右子树,什么先序遍历后序遍历什么,重点就是二叉树的的遍历,我还记得当时老师就说,考试的时候一定有二叉树的构建和遍历,现在想起来还是觉的老师是正确的,树状结果在实际项目应用的非常广泛. 咱就先说个最常见的例子,公司的人事管理就是一个典型的树状结构,你想想你公司的结构是不是这样: 老大,往下一层一层的管理,

3.30日第八次作业,第14章,采购管理,15章,信息文档和配置管理

3.30日第八次作业,第14章,采购管理,15章,信息文档和配置管理   第14章.采购管理1.采购管理包括哪些过程?(记)P382-383 答:1).编制采购计划.2).编制询价计划.3).询价.招投标.4).供方选择.5).合同管理.6).合同收尾. 2.编制采购计划过程的成果是什么?P386-387 答:1).采购管理计划.2).采购工作说明书. 3.判断:每个采购工作说明书都来自于项目范围基准.P387 答:是的. 4.结合P388页表14-1,工作说明书应该清楚地描述哪些内容?P388

【大话存储II】学习笔记(15章),文件级集群系统

[大话存储II]学习笔记(15章),块级集群存储系统里面分析的主要是块集群系统,同样文件级存储也可以集群化. 因为NAS系统的前端网络是以太网,速度比较低,导致NAS主要用于一些非关键业务中,比如文件共享.但是一些特殊应用也需要多主机同时访问某个大文件,比如3D渲染集群等.如果我们使用块集群存储系统,则会存在一个问题,需要在应用程序上引入文件锁,而NAS的文件系统一般都自带有文件锁机制,所以还不如把NAS存储系统进行集群化. 在谈怎么样把NAS系统进行集群化之前,我们说说集群文件系统的架构.集群

第15章、乐观可以有弹性

目录 第15章.乐观可以有弹性 "特大号"的自我 遗失的精神家园 取舍之间 特大号自我的宝藏 道德慢跑 学会乐观 弹性的乐观主义 乐观箴言 第15章.乐观可以有弹性 凌晨四点纠缠着我的恐惧在这两个月已经不复存在了.事实上,我的整个生活都改变了. 我有一个可爱的女儿--娜拉.现在我打字时,她安详地在旁边吃奶,大概每隔一分钟,她就停下来,用她深蓝色的眼睛望着我,对我微笑.微笑是她新学会的技巧,一笑起来整张脸都喜滋滋的. 我想起了去年冬天在夏威夷看到的小鲸鱼,它们在水中无忧无虑地嬉戏,它们的

java第15章示例代码

import java.util.Scanner; /** * * @author asus第15章示例代码1 全桂群2017.4.9 * */public class Registter { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); String uname, pw

第15章 就不能换DB吗?—抽象工厂模式

由于抽象工厂在我们编程当中经常使用和常见,所有本篇文章对<大话设计模式>中的15章做了很详细的比较.通过一个Dao层可以更换访问任意数据库的例子来学习抽象工厂模式.例如:Dao层可以访问Sqlserver数据库,也可以访问Access数据库,当程序新增访问Oracle数据库时,无需修改现有代码,只需要添加访问Oracle相关的类就可以,实现了开闭原则.本篇文章的例子中每种数据库上都有User和Department表,我们Dao层对这两个表进行查询和插入操作. 最基本数据库访问 一下是访问Sql

《白帽子讲WEB安全》学习笔记之第15章 web server配置安全

第15章 web server配置安全 15.1 apache安全 在linux部署安装web Server时候一定主要要使用"最小权限原则".尽量不要使用root部署. 15.2 nginx安全 Nginx 安全配置指南技术手册 PDF 下载 免费下载地址在http://linux.linuxidc.com/ 用户名与密码都是www.linuxidc.com 具体下载目录在 /pub/服务器相关教程/Nginx/Nginx 安全配置指南技术手册/ 参考资料:http://my.osc

【Android】15.0 第15章 广播和通知&mdash;本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-02-28 一.简介 广播(Broadcast):其功能类似于收音机的广播,你只要调到那个台(只要在接收的类中注册了要接收的广播),就能收到这个台播放的信息. 通知(Notifications):安卓的服务组件(Android Service,后面章节再细讲)本来是在后台运行的,可是,用户可能希望关注某个后台任务当前正在执行的状态或者结果,此时就可以利用"通知"在前台告诉用户. 二.本章示例主界面 1.运行截图 这个截图也