【CNN】ZFNet——让卷积神经网络不再是一个黑盒模型。

news2024/7/4 5:48:03

前言

ZFNet在2013年 ILSVRC 图像分类竞赛获得冠军,错误率11.19% ,比2012年的AlexNet降低了5%,ZFNet是由 Matthew D.Zeiler 和 Rob Fergus 在 AlexNet 基础上提出的大型卷积网络。ZFNet解释了为什么卷积神经网络可以在图像分类上表现的如此出色,以及研究了如何优化卷积神经网络。ZFNet提出了一种可视化的技术,通过可视化,我们就可以了解卷积神经网络中间层的功能和分类器的操作,这样就就可以找到较好的模型。ZFNet还进行消融实验来研究模型中的每个组件,它会对模型有什么影响。

1. ZFNet简介

ZFNet其实跟AlexNet很像, ZFNet 仅仅是在 AlexNet 上做了一些调参:
改变了 AlexNet 的第一层,即将卷积核的尺寸大小 11x11 变成 7x7,并且将步长 4 变成了 2(就这么一点点操作就改变了整个卷积神经网络的性能,并在2013年ImageNet大赛中夺冠) 。下面是ZFNet和AlexNet的详细网络参数:
在这里插入图片描述
除此之外,ZFNet最大的贡献是对卷积操作为什么对图像数据有效这个问题做出的一系列实验和解释。

2. 对卷积计算结果(feature maps)的可视化

作者将卷积核的计算结果(feature maps)映射回原始的像素空间(映射的方法为反卷积,反池化)并进行可视化。例如,下图Layer1区域最左上角的九宫格代表第一层卷积计算得到的前九张feature maps映射回原图像素空间后的可视化(称为f9)。第一层卷积使用96个卷积核,这意味着会得到96张feature maps,这里的前九张feature maps是指96个卷积核中值最大的9个卷积核对应生成的feature maps(这里称这9个卷积核为k9,即,第一层卷积最关注的前九种特征)。可以发现,这九种特征都是颜色和纹理特征,即蕴含语义信息少的结构性特征

为了证明这个观点,作者又将数据集中的原始图像裁剪成小图,将所有的小图送进网络中,得到第一层卷积计算后的feature maps。统计能使k9中每个kernel输入计算结果最大的前9张输入小图,即9*9=81张,如下图红框中右下角所示。结果表明刚刚可视化的f9和这81张小图表征的特征是相似的,且一一对应的。由此证明卷积网络在第一层提取到的是一些颜色,纹理特征。
在这里插入图片描述
同理,观察Layer2和Layer3的可视化发现,第二次和第三次卷积提取到的特征蕴含的语义信息更丰富,不再是简单的颜色纹理信息,而是一些结构化的特征,例如蜂窝形状,圆形,矩形等等。那么网络的更深层呢?我们看下图:
在这里插入图片描述
在网络的深层,如第四层,第五层卷积提取到的是更高级的语义信息,如人脸特征,狗头特征,鸟腿鸟喙特征等等。
最后,越靠近输出端,能激活卷积核的输入图像相关性越少(尤其是空间相关性),例如Layer5中,最右上角的示例:feature map中表征的是一种绿色成片的特征,可是能激活这些特征的原图相关性却很低(原图是人,马,海边,公园等,语义上并不相干);其实这种绿色成片的特征是‘草地’,而这些语义不相干的图片里都有‘草地’。‘草地’是网络深层卷积核提取的是高级语义信息,不再是低级的像素信息,空间信息等等。

总结:CNN输出的特征图有明显的层级区分。

越靠近输入端,提取的特征所蕴含的语义信息比较少,例如颜色特征,边缘特征,角点特征等等;

越靠近输出端,提取的特征所蕴含的语义信息越丰富,例如Layer4中的狗脸,鸟腿等,都属于目标级别的特征。

3. 网络中对不同特征的学习速度

如下图所示,横轴表示训练轮数,纵轴表示不同层的feature maps映射回像素空间后的可视化结果:
在这里插入图片描述
由此可以看出,low-level的特征(颜色,纹理等)在网络训练的训练前期就可以学习到, 即更容易收敛;high-level的语义特征在网络训练的后期才会逐渐学到。 由此展示了不同特征的进化过程。这也是一个合理的过程,毕竟高级的语义特征,要在低级特征的基础上学习提取才能得到。

4. 图片平移,缩放,旋转对CNN的影响

下图是探究图片平移对卷积模型影响的实验,a1是五张不同的图片经过不同大小的左右平移后的结果。

a2是原始图片与经过平移后的图片分别送进卷积网络后,第一层卷积计算得到的feature maps之间的欧氏距离,可以看出当图片平移0个像素时(即图中横轴=0处),距离最小(等于0)。其他位置随着左右平移,得到的距离都会陡增或陡减。五条彩色曲线分别代表五张不同的原始图片。

a3是原始图片与经过平移后的图片分别送进卷积网络后,第七层卷积计算得到的feature maps之间的欧氏距离,可以看出趋势与a2类似;但是,增减的曲线变换更平缓,这一定程度上说明了网络的深层提取的是高级语义特征,而不是低级的颜色,纹理,空间特征。这种语义信息不会随着平移操作而轻易改变,例如狗的图片平移后还是狗。

这个性质叫做:卷积拥有良好的平移不变性。

最后,a4表示的是原始图片与经过平移后的图片分别送进卷积网络后,卷积网络最后的识别结果。可以看出识别准确率是相对平稳的,且在横轴x=0时,识别准确率较高(此时,图片不平移,识别物体基本在图片中心位置)。
在这里插入图片描述
下图探究图片缩放对卷积模型影响的实验,实验方法和表述与上面探讨平移时的设置类似。结果表明,网络的浅层相较于网络的深层对缩放操作更敏感;且最终的识别准确率较平稳。这个趋势跟探究平移操作对卷积模型影响的趋势类似,即:卷积操作也具有良好的缩放不变性
在这里插入图片描述
下图是探究图片旋转对卷积模型影响的实验,可以看出旋转操作对卷积的影响正好与平移和缩放相反:卷积第一层对旋转的敏感程度较低,第七层对旋转的敏感程度高。这是因为颜色,纹理这些低级特征旋转前后还是相似的特征;但是目标级别的高级语义特征却不行,例如“特征9”旋转180°后变成了“特征6”. 看最终的识别准确率曲线也能发现旋转0°和350°时模型的识别准确率最高,因为此时旋转后模型最接近原始图片。对于某些存在对称性质的特征,例如原图中的电视,在旋转90°,180°,270°时都有不错的识别准确率。因此,卷积操作不具有良好的缩放不变性

在这里插入图片描述
总结:
卷积的平移不变性是从滑动遍历这个操作带来的,不管一个特征出现在图中的什么位置,卷积核都可以通过滑动的方式,滑动到特征上面做识别。

缩放不变性则是从网络的层级结构中获得,不同层的卷积操作拥有不同尺寸的计算感受野 。至于旋转不变性缺失找不到对应的操作。

那么,为什么现在的一些成熟项目,例如人脸识别,图像分类等依然可以对旋转的图片做识别呢? 这是因为我们用大量的训练数据,旋转不变性可以从大量的训练数据中得到。其实,不仅是旋转不变性,卷积本身计算方法带来的平移不变性和缩放不变性也是脆弱的,大部分也是从数据集中学习到的。深度学习是一种基于数据驱动的算法

5. ZFNet的改进点

ZFNet通过对AelxNet可视化发现,由于第一层的卷积核尺寸过大导致某些特征图失效(失效指的是一些值太大或太小的情况,容易引起网络的数值不稳定性,进而导致梯度消失或爆炸。图中的体现是(a)中的黑白像素块)。

此外,由于第一层的步长过大,导致第二层卷积结果出现棋盘状的伪影(例如(d)中第二小图和倒数第三小图)。因此ZFNet做了对应的改进。即将第一层 11X11步长为4的卷积操作变成 7X7步长为2的卷积。
在这里插入图片描述

6. 遮挡对卷积模型的影响

ZFNet通过对原始图像进行矩形遮挡来探究其影响,如下图所示
在这里插入图片描述
b表示计算遮挡后的图像经过第五个卷积层后得到的feature map 值的总和。红色代表更大的值。 由此可以看出来卷积计算后的特征图也是保留了原始数据中不同类别对象在图像中的空间信息。

c左上角的小图是经过第五个卷积后值最大的特征图的deconv可视化结果。由此实例2(可视化结果为英文字母或汉字,但原图的标签是“车轮”)可以看出卷积后值最大的特征图不一定是对分类最有作用的。c中的其他小图是统计数据集中其他图像可以使该卷积核输出最大特征图的deconv可视化结果。

d表示灰色滑块所遮挡的位置对图像正确分类的影响,红色代表分类成功的可能性大。例如博美犬的图像,当灰色滑块遮挡到博美犬的面部时,模型对博美犬的识别准确率大幅度下降。

e表示模型对遮挡后的图像的分类结果是什么。还拿博美犬的例子,灰色遮挡在图片中非狗脸的位置时,都不影响模型将其正确分类为博美犬(大部分都是蓝色标签,除了遮挡滑动到狗脸位置时)。

这个遮挡实验证明,模型确实可以理解图片,找到语义信息最丰富,对识别最关键的特征;而不是仅仅依靠一些颜色,纹理特征去做识别

此外,模型还做了进一步的遮挡实验来证明卷积可以提取到高级的语义特征,如下图所示:
在这里插入图片描述
通过遮挡图像的不同部位来证明CNN在处理图像的时候是关注局部的高级语义特征,而不是根据图像的全部信息来处理。

例如第二列遮挡左眼,表中的结果是求这五种不同狗 Dpair 的Hamming distance之和。注:Dpair是原图和遮挡图,Hamming distance是分别送进CNN中得到的feature map的差值之和。

数值越小表面遮挡左眼这个操作对不同种类的狗起到的作用是差不多的。

表中随机遮挡的结果(最后一列)明显大于有规律的遮挡,因此反应了CNN确实隐式对不同类别的同种特征做了学习总结。

值得注意的是,Layer7的随机遮挡结果明显小于Layer5,这说明深层的网络提取的是语义信息(例如狗的类属),而不是low-level的空间特征。因此对随机遮挡可以不敏感。

7. ZFNet的调参实验

本文通过如此之多的巧妙实验设计从各个方面对卷积操作为什么对图像有效,怎么有效做了详细的探究。
在这里插入图片描述
ZFNet对AelxNet进行了针对调参的消融实验。值得注意的是减少全连接层的参数反而可以提升一点准确率,一定程度证明了全连接层的参数还是太冗余了,即使有dropout。

最后,作者将不同层得到的feature maps直接送进分类器中分类,结果表明越深层的CNN提取到的feature maps对图像的分类帮助越大。结果如下图所示:
在这里插入图片描述

8. ZFNet实现代码(基于pytorch的python代码)

import torch.nn as nn
import torch 

# 与AlexNet有两处不同: 1. 第一次的卷积核变小,步幅减小。 2. 第3,4,5层的卷积核数量增加了。
class ZFNet(nn.Module):
    def __init__(self, num_classes=1000, init_weights=False):
        super(ZFNet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 96, kernel_size=7, stride=2, padding=2),  # input[3, 224, 224]  output[96, 111, 111]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[96, 55, 55]

            nn.Conv2d(96, 256, kernel_size=5, padding=2),           # output[256, 55, 55]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[256, 27, 27]

            nn.Conv2d(256, 512, kernel_size=3, padding=1),          # output[512, 27, 27]
            nn.ReLU(inplace=True),

            nn.Conv2d(512, 1024, kernel_size=3, padding=1),          # output[1024, 27, 27]
            nn.ReLU(inplace=True),

            nn.Conv2d(1024, 512, kernel_size=3, padding=1),          # output[512, 27, 27]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[512, 13, 13]
        )
        self.classifier = nn.Sequential(
            nn.Dropout(p=0.5),
            nn.Linear(512 * 13 * 13, 4096),
            nn.ReLU(inplace=True),

            nn.Dropout(p=0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            
            nn.Linear(4096, num_classes),
        )
        if init_weights:
            self._initialize_weights()

    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x, start_dim=1)
        x = self.classifier(x)
        return x

    def _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.Linear):
                nn.init.normal_(m.weight, 0, 0.01)
                nn.init.constant_(m.bias, 0)

def zfnet(num_classes): 
    model = ZFNet(num_classes=num_classes)
    return model

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

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

相关文章

[MySQL]事务ACID详解

专栏简介 :MySql数据库从入门到进阶. 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. 事务的概念 2. 事务的特性 3.事务控制语法…

【经验篇】Java使用ZMQ断线重连问题

简介 ZeroMQ是一个高性能的异步消息传递库,旨在用于分布式或者并发应用程序。它提供了一个消息队列,但与面向消息的中间件不同,ZeroMQ 系统可以在没有专用消息代理的情况下运行。 ZeroMQ 支持各种传输(TCP、进程内、进程间、多播…

初步认识端口服务查询--netstat

转载连接:netstat详解 目录1、语法与参数概括2、输出释义2.1 以netstat -atnlp为例,解释输出结果中各列的含义2.2、以netstat -rn为例,解释输出结果中各列的含义3、实用命令4、项目中通过netstat查询某端口是否被占用netstat命令是一个监控TC…

Spring5源码3-BeanDefinition

1. BeanDefinition BeanDefinition在spring中贯穿始终,spring要根据BeanDefinition对象来实例化bean,只有把解析的标签,扫描的注解类封装成BeanDefinition对象,spring才能实例化bean beanDefinition主要实现类: ChildBeanDefini…

ADB安装及使用详解

一、ADB简介 1、什么是adb ADB 全称为 Android Debug Bridge,起到调试桥的作用,是一个客户端-服务器端程序。其中客户端是用来操作的电脑,服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具,可以直接操作管理 Androi…

K8s高可用集群搭建

K8s高可用集群搭建1 方案简介2 集群搭建2.1 安装要求2.2 准备环境2.3 master节点部署keepalived2.4 master节点部署haproxy2.5 所有节点安装docker/kubeadm/kubelet2.6 部署k8smaster012.7 安装集群网络2.8 k8smaster02加入节点2.9 k8snode01加入集群3 测试集群1 方案简介 用到…

Session-based Recommendation with Graph Neural Networks论文阅读笔记

1. Abstract (1)基于会话的推荐问题旨在基于匿名会话来预测用户的行为。 The problem of session-based recommendation aims to predict user actions based on anonymous sessions. (2) 以前的方法存在的不足:不足以…

day3-day4【代码随想录】长度最小的子数组

文章目录前言一、长度最小的子数组1、暴力求解:2、滑动窗口求解:二、最小覆盖子串(乐扣76)难难难难难三、水果成篮(乐扣904)四、最长重复子数组(乐扣718)前言 实现滑动窗口&#xf…

Android抓包工具——Fiddler

前言 🔥在平时和其他大佬交流时,总会出现这么些话,“抓个包看看就知道哪出问题了”,“抓流量啊,payload都在里面”,“这数据流怎么这么奇怪”。 👉这里出现的名词,其实都是差不多的…

矩阵分析:特征值分解

矩阵分析:特征值分解前置知识空间变换伸缩旋转对称矩阵对称矩阵对角化正交矩阵向量的基基变换不同基下的向量变换逆矩阵不同基下的空间变换内积的几何意义特征值、特征向量特征值分解代码前置知识 空间变换 伸缩 一个矩阵其实就是一个线性变换,因为一个…

SpringCloud微服务(六)——Gateway路由网关

Gateway路由网关 Spring Cloud Spring Cloud Gateway统一访问接口的路由管理方式 作用 整合各个微服务功能,形成一套系统微服务网关实现日志统一纪录实现用户的操作跟踪统一用户权限认证路由转发、跨域设置、负载均衡、服务限流反向代理 微服务网关的概述 不同…

H2DCFDA | ROS 荧光探针检测法

H2DCFDA 工作液的配制1、储存液的配制:用 DMSO 配制 10 mM 的 H2DCFDA (2,000),如用 1.03 mL DMSO 溶解 5 mg H2DCFDA。注:H2DCFDA 储存液建议分装后-20℃ 避光冻存,一个月。-80 半年。2、工作液的配制:用预热好的无血…

绘制文字(QFont字体)

QPainter绘制文字的话使用的函数为 QPainter::drawText() QPainter::drawText()有多种重载方式。 根据坐标直接绘画文字: void Widget::paintEvent(QPaintEvent *event)//绘图事件 {QPainter painter(this);painter.translate(100,100);//移动坐标painter.drawText(…

E. Sending a Sequence Over the Network(DP)

Problem - 1741E - Codeforces 序列a在网络上的发送情况如下。 序列a被分割成若干段(序列的每个元素正好属于一个段,每个段是序列的一组连续元素)。 对于每个段,它的长度被写在它的旁边,要么在它的左边,要…

递归展示树状图/树状表格

递归展示树状图一、数据库表设计二、后端java递归代码三、前端展示树状表格四、效果展示一、数据库表设计 这里我们采用自关联的设计,通过id和pid的对应来确认数据的上下级关系 建表语句,我这里把一级菜单的pid设置成了0 /*Navicat Premium Data Transfe…

Spring中Bean的作用域和生命周期

目录 Bean的作用域 singleton prototype request session application websocket 单例作用域和全局作用域的区别 Bean的生命周期 Bean的作用域 Bean的作用域是指Bean在Spring整个框架中的某种行为模式,比如singleton单例作用域,就表示Bean在整…

大数据Spark面试题2023

文章目录Spark核心——RDD概念特点创建方式RDD的分区依赖关系Spark的shuffle介绍Spark的 Partitioner 分区器都有哪些?Spark中的算子都有哪些RDD工作流📌Spark运行模式(资源调度框架的使用,了解)📌讲一下Spark 的运行架构一个spark程序的执行…

常用的框架技术-08 ElasticSearch分布式、高扩展、高实时的搜索与数据分析引擎

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录1.ElasticSearch 概述1.1 ElasticSearch介绍1.2 全文搜索引擎1.3 lucene介绍1.4 倒排索引1.5 elasticsearch、solr对比2.ElasticSearch安装2.1 下载软件2.2 windows环…

【web渗透思路】框架敏感信息泄露(特点、目录、配置)

目录 一、挖掘思路 1、方法: 二、框架之信息泄露 1、Webpack 1.1、简述 1.2、.js.map文件泄露 1.3、源码审计 2、Spring boot 1.1、简述 1.2、利用 1.3、框架识别 (基本分析方法都是一样,这里就举2个框架关于信息泄露方面的&#x…

Mybatis分页功能

1. 功能分析 如图所示分页功能,包括上一页、下一页、中间显示的当前页前后页码、全部页码以及跳转到XX页。手写的话实现起来很难,Mybatis给我们提供了插件,所提供的方法,直接包含了上述分页的相关数据。 2. 分页插件的使用及其相关…