博客:blog.shinelee.me | 博客园 | CSDN

写在前面

ZFNet出自论文《 Visualizing and Understanding Convolutional Networks》,作者Matthew D. Zeiler和Rob Fergus——显然ZFNet是以两位作者名字的首字母命名的,截止20190911,论文引用量为4207。ZFNet通常被认为是ILSVRC 2013的冠军方法,但实际上ZFNet排在第3名,前两名分别是Clarifai和NUS,不过Clarifai和ZFNet都出自Matthew D. Zeiler之手,见ILSVRC2013 results

ZFNet(2013)在AlexNet(2012)的基础上,性能再次提升,如下图所示,图片来自cs231n_2019_lecture09

论文最大的贡献有2个:

  • 提出了ZFNet,一种比AlexNet性能更好的网络架构
  • 提出了一种特征可视化的方法,并据此来分析和理解网络

本文将围绕上述2点展开,先介绍网络架构,再介绍特征可视化的方法。

网络架构与动机

ZFNet的网络架构如下

ZFNet的网络架构是在AlexNet基础上修改而来,与AlexNet相比,差异不大:

  • 第1个卷积层,kernel size从11减小为7,将stride从4减小为2(这将导致feature map增大1倍)
  • 为了让后续feature map的尺寸保持一致,第2个卷积层的stride从1变为2

仅这2项修改,就获得了几个点的性能提升。所以,重要的是为什么这样修改?这样修改的动机是什么?文中这样叙述:

通过对AlexNet的特征进行可视化,文章作者发现第2层出现了aliasing。在数字信号处理中,aliasing是指在采样频率过低时出现的不同信号混淆的现象,作者认为这是第1个卷积层stride过大引起的,为了解决这个问题,可以提高采样频率,所以将stride从4调整为2,与之相应的将kernel size也缩小(可以认为stride变小了,kernel没有必要看那么大范围了),这样修改前后,特征的变化情况如下图所示,第1层呈现了更多更具区分力的特征,第二2层的特征也更加清晰,没有aliasing现象。更多关于aliasing的内容,可以参见Nyquist–Shannon sampling theoremAliasing

这就引出了另外一个问题,如何将特征可视化?正如论文标题Visualizing and Understanding Convolutional Networks所显示的那样,与提出一个性能更好的网络结构相比,这篇论文更大的贡献在于提出一种将卷积神经网络深层特征可视化的方法

特征可视化

在博文《卷积神经万络之卷积计算、作用与思想》 博客园 | CSDN | blog.shinelee.me 中,我们讲到卷积神经网络通过逐层卷积将原始像素空间逐层映射到特征空间,深层feature map上每个位置的值都代表与某种模式的相似程度,但因为其位于特征空间,不利于人眼直接观察对应的模式,为了便于观察理解,需要将其映射回像素空间,“从群众中来,到群众中去”,论文《 Visualizing and Understanding Convolutional Networks》就重点介绍了如何“到群众中去”。

可视化操作,针对的是已经训练好的网络,或者训练过程中的网络快照,可视化操作不会改变网络的权重,只是用于分析和理解在给定输入图像时网络观察到了什么样的特征,以及训练过程中特征发生了什么变化。

下面这张图截自论文同款talk

给定1张输入图像,先前向传播,得到每一层的feature map,如果想可视化第\(i\)层学到的特征,保留该层feature map的最大值,将其他位置和其他feature map置0,将其反向映射回原始输入所在的像素空间。对于一般的卷积神经网络,前向传播时不断经历 input image→conv → rectification → pooling →……,可视化时,则从某一层的feature map开始,依次反向经历 unpooling → rectification → deconv → …… → input space,如下图所示,上方对应更深层,下方对应更浅层,前向传播过程在右半侧从下至上,特征可视化过程在左半侧从上至下:

可视化时每一层的操作如下:

  • Unpooling:在前向传播时,记录相应max pooling层每个最大值来自的位置,在unpooling时,根据来自上层的map直接填在相应位置上,如上图所示,Max Locations “Switches”是一个与pooling层输入等大小的二值map,标记了每个局部极值的位置。
  • Rectification:因为使用的ReLU激活函数,前向传播时只将正值原封不动输出,负值置0,“反激活”过程与激活过程没什么分别,直接将来自上层的map通过ReLU。
  • Deconvolution:可能称为transposed convolution更合适,卷积操作output map的尺寸一般小于等于input map的尺寸,transposed convolution可以将尺寸恢复到与输入相同,相当于上采样过程,该操作的做法是,与convolution共享同样的卷积核,但需要将其左右上下翻转(即中心对称),然后作用在来自上层的feature map进行卷积,结果继续向下传递。关于Deconvolution的更细致介绍,可以参见博文《一文搞懂 deconvolution、transposed convolution、sub-­pixel or fractional convolution》 博客园 | CSDN | blog.shinelee.me

不断经历上述过程,将特征映射回输入所在的像素空间,就可以呈现出人眼可以理解的特征。给定不同的输入图像,看看每一层关注到最显著的特征是什么,如下图所示:

其他

除了网络架构和可视化方法,论文中还有其他一些值得留意的点,限于篇幅就不展开了,这里仅做记录,详细内容可以读一读论文:

  • Occlusion Sensitivity 实验:使用一个灰色的小块,遮挡输入图像的不同区域,观察对正类输出概率的影响,以此来分析哪个区域对分类结果的影响最大,即对当前输入图像,网络最关注哪个区域。结果发现,feature map最强响应可视化后对应的区域影响最大。
  • Feature Generalization:在ImageNet上预训练,固定权重,然后迁移到其他库上(Caltech-101、Caltech-256),重新训练最后的softmax classifier,只需要很少的样本就能快速收敛,且性能不错。
  • Feature Analysis:对训练好的网络,基于每一层的特征单独训练SVM或Softmax分类器,来评估不同层特征的区分能力,发现越深层的特征区分能力越强。

以上。

参考

ZFNet(2013)及可视化的开端的更多相关文章

  1. ZfNet解卷积:可视化CNN模型( PythonCode可视化Cifar10)

    原文链接:caffe Model的可视化 snapshot: 6000       一个在线可视化小工具:http://blog.csdn.net/10km/article/details/52713 ...

  2. 使用Visual Studio 2013编写可维护的本地可视化(natvis)

    在Visual Studio 2012中,我们介绍了创建可视化使用原生类型的能力natvis文件. Visual Studio 2013中包含了一些改进,使其更容易编写可视化的类,在内部利用收集来存储 ...

  3. 使用C#代码部署SharePoint 2013开发包简单总结(一)

    这篇文章将总结下如何将自己开发的列表.Web部件.事件接收器等元素部署到SharePoint的服务器.因水平有限,我的做法未必是最佳实践,会有些错误理解和疏漏,欢迎各位高手批评指正——但一定要能给出更 ...

  4. 商业智能(BI)选型手册(转载)

    摘自http://articles.e-works.net.cn/bi/Article126429.htm 1.前言 互联网时代企业数据呈现爆发式增长,全面考验着企业的数据处理和分析能力.面对大容量. ...

  5. AI:IPPR的数学表示-CNN结构进化(Alex、ZF、Inception、Res、InceptionRes)

    前言: 文章:CNN的结构分析-------:  文章:历年ImageNet冠军模型网络结构解析-------: 文章:GoogleLeNet系列解读-------: 文章:DNN结构演进Histor ...

  6. Visual Studio 2013 Ultimate的可视化代码功能

    可视化和了解代码综合了如何使用visual studio可视化代码来帮助理解代码: 理解代码和代码之间的关系:(1)Code Map(2)Dependency Graphs 理解代码交互:Sequen ...

  7. SharePoint 2013 工作流设计之Designer 使用“可视化视图”

    SharePoint 2013增强了工作流功能,而Designer里面也添加了可视化设计视图,也就是类似Visio的设计视图(需要Visio 2013支持),下面我们简单介绍下,在可视化视图下,使用工 ...

  8. SharePoint 2013 图文开发系列之可视化WebPart

    有了WebPart开发的基础,再进行可视化WebPart开发,就容易多了.创建和开发过程,两者非常相似,下面,我们简单介绍下可视化WebPart的开发. 1.添加新项目,选择SharePoint 20 ...

  9. Visual Studio 2013下JSON可视化工具

          Visual Studio 2013现在我们有个小工具可以实现JSON可视化,这样给我们调试JSON提供了便利. JSON这种数据格式已经比较流行,在WEB前端随处可见. 在你需要安装VS ...

随机推荐

  1. 使用sc 命令写脚本 添加和删除服务 简单应用

    添加服务 @echo.服务启动...... @echo off @sc create 服务名 binPath= "%~dp0\服务路径" @sc config 服务名 start= ...

  2. imwrite imshow机制

    今天在做数据增强的时候,遇到一个奇怪的问题.调用imwite生成的图片,在本地用图片查看器打开的时候是正常的.但是在代码里imshow的时候是一片亮白. 代码类似如下 gaussian_img = a ...

  3. IDEA导入spring-boot-plus(二)

    IDEA导入spring-boot-plus 安装lombok插件 !!!请先确保IDEA已安装lombok插件!!! IDEA在线安装lombok插件 IDEA离线下载安装lombok 如果在线安装 ...

  4. 定时清理docker私服镜像

    定时清理docker私服镜像 使用CI构建docker镜像进行发布极大促进了大家的版本发布效率,于是镜像仓库也就急速膨胀.为了缓解磁盘压力,我们需要设置一些清理策略. 对于不同docker镜像的清理策 ...

  5. mybatis逆向工程maven版本idea工具

    基于springboot2版本 pom基本依赖 <parent> <groupId>org.springframework.boot</groupId> <a ...

  6. 图灵学院Java架构师-VIP-【性能调优-Mysql索引数据结构详解与索引优化】

    最近报名了图灵学院的架构专题的付费课程,没有赶上6月份开课,中途加入的.错过了多线程的直播课程,只能看录播了

  7. SSH开发模式——Struts2(第二小节)

    上一小节已经学会了如何去搭建Struts2的开发环境,该篇博客我们继续深入Struts2,了解Struts2框架的拦截器. 首先对我们在web.xml文件配置的过滤器进行一个源码的分析. 在Strut ...

  8. Postman系列五:Postman中电商网站cookie、token检验与参数传递实战

    一:Postman中电商网站cookie实战 Postman接口请求使用cookie两种方式: 1.直接在header(头域)中添加cookie,适用于已知请求cookie头域的情况 2.使用Post ...

  9. python 17 内置模块

    目录 1. 序列化模块 1.1 json 模块 1.2 pickle 模块 2. os 模块 3. sys 模块 4. hashlib 加密.摘要 4.1 加密 4.2 加盐 4.3 文件一致性校验 ...

  10. Android进阶之路(1)-详解MVC

    最近因为换工作的原因没有写博客,现在慢慢稳定了,我准备写一些关于Android 进阶的文章,也是为了督促自己学习,大家一起进步! 今天详细的分析一下Android APP架构之一:MVC ### MV ...