如何使用CNN进行物体识别和分类_可能我们之前都想错了:CNN的图像分类策略其实出奇的简单呢!...

a928d35f049b6c6e42713feeee1cb869.png

【新智元导读】ICLR 2019一篇论文指出:DNN解决ImageNet时的策略似乎比我们想象的要简单得多。这个发现使我们能够构建更具解释性和透明度的图像分类管道,同时也解释了现代CNN中观察到的一些现象。

全文约3300字6图,读完可能需要10分钟

CNN非常擅长对乱序图像进行分类,但人类并非如此。

在这篇文章中,作者展示了为什么最先进的深度神经网络仍能很好地识别乱码图像,探究其中原因有助于揭示DNN使用让人意想不到的简单策略,对自然图像进行分类。

在ICLR 2019一篇论文指出上述发现能够:

  1. 解决ImageNet比许多人想象的要简单得多
  2. 使我们能够构建更具解释性和透明度的图像分类pipeline
  3. 解释了现代CNN中观察到的一些现象,例如对纹理的偏见以及忽略了对象部分的空间排序

复古bag-of-features模型

在深度学习出现之前,自然图像中的对象识别过程相当粗暴简单:定义一组关键视觉特征(“单词”),识别每个视觉特征在图像中的存在频率(“包”),然后根据这些数字对图像进行分类。 这些模型被称为“特征包”模型(BoF模型)。

举个例子,给定一个人眼和一个羽毛,我们想把图像分类为“人”和“鸟”两类。最简单的BoF模型工作流程是这样的:对于图像中的每只眼睛,它将“人类”的证据增加+1。反之亦然;对于图像中的每个羽毛,它将增加“鸟”的证据+1;无论什么类积累,图像中的大多数证据都是预测的。

这个最简单的BoF模型有一个很好的特性,是它的可解释性和透明的决策制定。我们可以准确地检查哪个图像特征携带了给定的类的证据,证据的空间整合是非常简单的(与深度神经网络中的深度非线性特征整合相比),很容易理解模型如何做出决定。

传统的BoF模型在深度学习开始之前一直非常先进、非常流行。但由于其分类性能过低,而很快失宠。可是,我们怎么确定深度神经网络有没有使用与BoF模型截然不同的决策策略呢?

一个很深却可解释的BoF网络(BagNet)

为了测试这一点,研究人员将BoF模型的可解释性和透明度与DNN的性能结合起来。

  • 将图像分割成小的q x q图像色块
  • 通过DNN传递补丁以获取每个补丁的类证据(logits)
  • 对所有补丁的证据求和,以达到图像级决策
19340ec104fcad1305fd477ca2178f73.png

BagNets的分类策略:对于每个补丁,我们使用DNN提取类证据(logits)并总结所有补丁的总类证据

为了以最简单和最有效的方式实现这一策略,我们采用标准的ResNet-50架构,用1x1卷积替换大多数(但不是全部)3x3卷积。

在这种情况下,最后一个卷积层中的隐藏单元每个只“看到”图像的一小部分(即它们的感受野远小于图像的大小)。

这就避免了对图像的显式分区,并且尽可能接近标准CNN,同时仍然实现概述的策略,我们称之为模型结构BagNet-q:其中q代表最顶层的感受域大小(我们测试q=9,17和33)。BagNet-q的运行时间大约是ResNet-50的运行时间的2.5倍。

69b5c52b330961ecdfcc89ba65c5c8b6.png

在ImageNet上具有不同贴片尺寸的BagNets的性能。

即使对于非常小的贴片尺寸,BagNet上的BagNets性能也令人印象深刻:尺寸为17 x 17像素的图像特征足以达到AlexNet级别的性能,而尺寸为33 x 33像素的特征足以达到约87%的前5精度。通过更仔细地放置3 x 3卷积和额外的超参数调整,可以实现更高的性能值。

这是我们得到的第一个重要结果:只需使用一组小图的特性即可解决ImageNet问题。对象形状或对象部分之间的关系等远程空间关系可以完全忽略,并且不需要解决任务。

BagNets的一大特色是他们透明的决策。例如,我们现在可以查看哪个图像特征对于给定的类最具预测性。

30d04aad0b3a3662f4db87326f0c3a20.png

图像功能具有最多的类证据。 我们展示了正确预测类(顶行)的功能和预测错误类(底行)的分散注意力的功能。

上图中,最上面的手指图像被识别成tench(丁鱥guì,是淡水钓鱼的主要鱼种,也是鲈鱼等猎食性鱼类的饲料),因为这个类别中的大多数图像,都有一个渔民像举奖杯一样举起丁鱥。

同样,我们还得到一个精确定义的热图,显示图像的哪些部分促使神经网络做出某个决定。

e07f876790f3f8869979860fc793099b.png

来自BagNets的热图显示了确切的图像部分对决策的贡献。 热图不是近似的,而是显示每个图像部分的真实贡献。

ResNet-50与BagNets惊人相似

BagNets表明,基于本地图像特征和对象类别之间的弱统计相关性,可以在ImageNet上达到高精度。

如果这就够了,为什么像ResNet-50这样的标准深网会学到任何根本不同的东西? 如果丰富的本地图像特征足以解决任务,那为什么ResNet-50还需要了解复杂的大尺度关系(如对象的形状)?

为了验证现代DNN遵循与简单的特征包网络类似的策略的假设,我们在BagNets的以下“签名”上测试不同的ResNets,DenseNets和VGG:

  • 决策对图像特征的空间改组是不变的(只能在VGG模型上测试)
  • 不同图像部分的修改应该是独立的(就其对总类证据的影响而言)
  • 标准CNN和BagNets产生的错误应该类似
  • 标准CNN和BagNets应对类似功能敏感

在所有四个实验中,我们发现CNN和BagNets之间的行为非常相似。 例如,在上一个实验中,我们展示了BagNets最敏感的那些图像部分(例如,如果你遮挡那些部分)与CNN最敏感的那些基本相同。

实际上,BagNets的热图(灵敏度的空间图)比由DeepLift(直接为DenseNet-169计算热图)等归因方法生成的热图,更好地预测了DenseNet-169的灵敏度。

当然,DNN并不完全类似于特征包模型,但确实显示出一些偏差。特别是,我们发现网络越深入,功能越来越大,远程依赖性也越来越大。

因此,更深层的神经网络确实改进了更简单的特征包模型,但我认为核心分类策略并没有真正改变。

解释CNN几个奇怪的现象

将CNN的决策视为一种BoF策略,可以解释有关CNN的几个奇怪的观察。首先,它将解释为什么CNN具有如此强烈的纹理偏差;其次,它可以解释为什么CNN对图像部分的混乱如此不敏感;甚至可以解释一般的对抗性贴纸和对抗性扰动的存在,比如人们在图像中的任何地方放置误导信号,并且无论这些信号是否适合图像的其余部分,CNN仍然可以可靠地接收信号。

我们的成果显示,CNN利用自然图像中存在的许多弱统计规律进行分类,并且不会像人类一样跳向图像部分的对象级整合。其他任务和感官方式也是如此。

我们必须认真思考如何构建架构、任务和学习方法,以抵消这种弱统计相关性的趋势。一种方式,是将CNN的归纳偏差从小的局部特征改善为更全局的特征;另一种方式,是删除、或替换网络不应该依赖的那些特征。

然而,最大的问题之一当然是图像分类本身的任务:如果局部图像特征足以解决任务,也就不需要去学习自然界的真实“物理学”,这样我们就必须重构任务,推着模型去学习对象的物理本质。

这样就很可能需要跳出纯粹只通过观察学习,获得输入和输出特征之间相关性的方式,以便允许模型提取因果依赖性。

总结

总之,我们的结果表明CNN可能遵循极其简单的分类策略。科学家认为这个发现可能在2019继续成为关注的焦点,凸显了我们对深度神经网络的内部运作了解甚少。

缺乏理解使我们无法从根本上发展出更好的模型和架构,来缩小人与机器之间的差距。深化我们的理解,将使我们能够找到弥合这一差距的方法。

这将带来异常丰厚的回报:当我们试图将CNN偏向物体的更多物理特性时,我们突然达到了接近人类的噪声稳健性。

我们继续期待在2019年,在这一领域上会出现更多令人兴奋的结果,获得真正了解了真实世界中,物理和因果性质的卷积神经网络。

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

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

相关文章

【小记】-006--关于高度塌陷的问题

最近遇到一个问题:当使用 position:absolute 时,给父元素添加 position:relative 父元素高度塌陷,此时如何使得父元素的高度被子元素撑开? 我了解到的高度塌陷无非就是:float属性,display:absolute/fixed属性 float与d…

StringBuffer的存在的含义

当我处理旧代码并跨StringBuffer实例运行时,通常将它们替换为StringBuilder实例。 尽管可以从此更改中获得性能优势,但我经常在我知道对性能影响不大的地方对其进行更改。 我认为,除了可能带来性能收益外,还应出于各种原因进行更改…

matlab 大括号

大括号,用于cell型的数组的分配或引用。 >> acell(2,1)a [][]>> a(1,1)[2,3,4,0;5,6,7,8];无法从 double 转换为 cell。>> a(1,1){[2,3,4,0;5,6,7,8]};>> a(2,1){str};>> aa [2x4 double]str >>

J2EE项目代码编写规范分享

码编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯。 代码编写规范使用范围:J2EE项目开发。 包命名规范: 目的:包的命名规范应当体现出项目资源良好的划分 servlet类所在包命名规范&am…

Socket套接字 =======================

http://www.cndartlang.com/841.html 转载于:https://www.cnblogs.com/pythonClub/p/10732555.html

matlab 中括号

中括号用来构建向量(Vectors)或者是矩阵(Matrices)。如[6.9 9.64 sqrt(-1)] 就是一个有三个元素的向量。[11 12 13; 21 22 23] 是个2*3的矩阵. 分号(;)用来结束一行。 中括号的另一个作用是在函数中,分配输出参数。 Matlab 方括号“[ ]”的作用 1定义矩阵&#xff…

mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官

转载地址:阿里java架构教你怎么用mysql怒怼面试官​www.jianshu.com说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了。后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和BTree结构,很少提到我们的集群配…

详解SQL中drop、delete和truncate的异同

第一:相同点: truncate和不带where子句的delete,以及drop 都会删除表内的数据 第二:不同点: 1. truncate和delete只删除数据不删除表的结构(定义) drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigg…

2039 三角形

三角形 http://acm.hdu.edu.cn/showproblem.php?pid2039 1 #pragma warning(disable:4996) 2 #include<stdio.h>3 int main()4 {5 int n;6 double a, b, c;7 while (scanf("%d", &n) ! EOF)8 {9 for (int i 0; i < n; i) 10 …

java正则表达式用法示例_Java正则表达式教程及示例

java正则表达式用法示例当我开始使用Java时&#xff0c;正则表达式对我来说是一场噩梦。 本教程旨在帮助您掌握Java正则表达式&#xff0c;并让我定期返回以刷新我的正则表达式学习。 什么是正则表达式&#xff1f; 正则表达式定义字符串的模式。 正则表达式可用于搜索&#…

查看ip

查看 http://httpbin.org/ip

Python中表示偶数_蒙特卡洛模拟(Python)深入教程

译者&#xff1a;大表哥、wiige来源&#xff1a;AI研习社什么是蒙特卡罗模拟&#xff1f;蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的技术。蒙特卡罗模拟或概率模拟是一种技术&#xff0c;用于了解金融部门、项目管理、成本和其他预测机器学习模型中风险和不确定性的影…

琥珀项目:Java的未来揭晓

如果一切按计划进行&#xff08;我们正在研究Jigsaw项目&#xff09;&#xff0c;那么Java 9将在不到100天的时间内启动。 您可以在此处加入倒计时以发布它。 它将包含一长串新功能和升级功能&#xff0c;其中一些我们迫不及待想要看到实际应用。 但是&#xff0c;有些功能还没…

安装saltstack

https://www.cnblogs.com/agnewee/p/6487262.html 官方资料&#xff1a;https://docs.saltstack.com/en/latest/ref/configuration/index.html 官网资料&#xff1a;https://repo.saltstack.com/#rhel yum install https://repo.saltstack.com/py3/redhat/salt-py3-repo-latest…

python中for和while区别_Python学习第九篇——while和for的区别

1 pets [dog,cat,dog,goldfish,cat,rabbit,cat]2 print(pets)3 for pet inpets:4 print(pet)5 #------------------------------------------ 6 pets [dog,cat,dog,goldfish,cat,rabbit,cat]7 print(pets)8 while pet inpets:9 print(pet) 上述代码都想打印列表中的所有元素&…

java 11:数组作为函数参数,数组做为函数返回值

1 数组作为参数 我们可以将数组作为参数&#xff0c;传入到函数中&#xff0c;其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数&#xff1b; 又如&#xff0c; [java] view plaincopypublic class ArrayPar { public static void p…

C++ 指针基本概念

Ⅰ.内存和地址 我们已经很熟悉一些基本的存储单位了,比如一个bit(位)用存储0或者1.也可以把几个bit合起来表示更大的数字,比如一个byte(字节)就包含了8个bit.这些都是很基础很简单的东西.然后我们可以把计算机的内存想象成一个字节数组,内存中的每一个地址表示一个字节. 每个字…

Java 7:使用NIO.2进行文件过滤–第2部分

大家好。 这是使用NIO.2系列进行文件过滤的第2部分。 对于那些尚未阅读第1部分的人 &#xff0c;这里有个回顾。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以执行与java.io相同的操作&#xff0c;以及许多出色的功能&#xff0c;例如&a…

机器人教育发展_得于人工智能发展,机器人教育低龄化越来越普及

近两年&#xff0c;各种看得到看不到的渠道都在推荐学机器人少儿编程&#xff0c;虽有利益使然&#xff0c;不过机器人少儿编程也确实算得上是通往世界名校大门的快速通道。相信很多家长也同样能感到&#xff0c;最近这股风刮得实在是太大&#xff0c;以至于周围的家长们都开始…

C#相对路径

1、 根目录 .\\ 或者直接给出文件名称&#xff0c;是找根目录的路径。 如&#xff1a;path "gs.mdb" 与 path ".\\gs.mdb"是一个意思。 2、 根目录的上级目录, 在C#中是指定到bin文件夹里面 ..\\ 应用程序的根目录的上两级 3、指定到根目录上面的三级目录…