卷积网络的平移不变性可能会经常在论文中看到,那这个到底是什么呢?看了一些论文的原文和网络上十几篇讲这个的博文,大概捋清了思路然后写下这个。不得不说,有的博文讲的有那么点问题。

1 什么是不变性

【不变性】就是目标发生了变换,但是你依然可以识别出来。在图像任务中,我们希望图像中的目标即使被平移、被旋转或者被缩放,模型都可以识别出来图像的目标。

所以不变性有下面几种:

  • 平移不变性:Translation Invariance
  • 旋转不变性:Rotation Invariance
  • 尺度不变性:scale Invariance
  • 光照不变性:Illumination Invariance

在图像分类任务中,平移不变性就是图像中的目标不管被移动到哪个位置,模型给出的标签应该都是相同的。

平移不变性对应的有一个概念是平移同变性(translation equivariance),这个是用在图像的目标检测中的,如果输入图像中的目标进行了平移,那么最终检测出来的候选框应该也相应的移动,这就是同时改变。】

2 卷积网络有没有平移不变性

有的文章说有,有的说没有,那么到底有没有呢?

我先说出我个人的观点,现在的卷积网络是不具有平移不变性的。不过两个论点我都会讲明白。

3 为什么有平移不变性

主要是由两个原因,一个是卷积,一个是最大池化。

【为什么卷积可以提供平移不变性】

比方说目标是在图像的左上角,经过卷积之后,目标的特征也会在特征图的左上角;目标在图像的左下角,经过相同的卷积核卷积之后,目标的特征也会在特征图的左下角。然后卷积层后面接上一个全连接层进行分类,就算目标位置改变了,但是经过相同的卷积核卷积,然后展开变成全连接层。所以对于全连接层来说,改变的之后特征的位置。可能之前目标的特征是作为全连接的第一个神经元的输入,平移目标位置之后,该特征就作为全连接的最后一个神经元的输入。

不过这种说法想体现的就是,就算目标位置变了,经过相同卷积核提取的特征该有的都有,只是位置变了。


【我个人觉得这个论证有点问题,特征的顺序对于网络来说非常重要,打乱了那很大可能会给出错误的答案。上述的论点来源于引用[1]的博客】


【为什么池化可以提供平移不变性】

我觉得这个相比上面的解释,是有一定的道理的。最大池化层返回感受野中的最大值,如果最大值被移动了,但是仍然在这个感受野中,那么池化层也仍然会输出相同的最大值。这就有点平移不变的意思了。

在参考链接[2]中,给出了几个“池化层具有不变性”的例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RgYXVsMc-1595352073693)(http://helloworld2020.net/wp-content/uploads/2020/07/wp_editor_md_c94b9fb055f201230a5f6ba383f04768.jpg)]

可以看到,同样的数字1,原图中平移了1个像素,但是经过2*2的最大池化层之后,得到了相同的特征图。

此外,最大池化层还可以根据类似的原理,得到尺度不变性和旋转不变性:



【池化层引入了平移不变性我觉得是比较靠谱的,这也是池化层的重要作用之一:为CNN引入不变性。但是怎么说呢?虽然目前听起来很有道理,在面试的时候被问起来池化层作用的时候我觉得回答上不变性也是不错的,但是下文就会讲解,池化层实际上并没有引入不变性。好像是2019年的一个论文强调了池化层并没有不变性】

4 为什么没有平移不变性

现在卷积网路的图像输入,改变一个像素就可能会得出不同的结构,所以很容易遭到对抗攻击。下面有一个形象的例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mZuTor9L-1595352073705)(http://helloworld2020.net/wp-content/uploads/2020/07/ezgif-6-e30035fc1a35.gif)]

可以看出来,当平移小鸟的位置的时候,预测结果是有很大的波动的。

池化层并没有平移不变性。下面是参考链接[3]给出的一个简单的例子,这是一个一维卷积的例子,二维图像类似:



上图是一个没有平移的原始一位数据做了一个1*2的最大池化;



如果对一位数据做了一个平移,那么得到的池化结果就完全不同!这也就是为什么下采样(平均池化层,最大池化层等)没有平移不变性。

5 平移不变性的定义

说了这么多平移不变性,那么平移不变性的具体的严格的定义到底是什么呢?

定义几个数学符号。原始的输入数据为\(X\),经过下采样层变成\(D(X)\),然后再经过上采样得到\(U(D(X))\).(D是Down下采样,U是Up上采样)

【平移不变性】

如果平移之后的输入图像的下采样的上采样与原始输入图像的下采样的上采样相同,那么就是平移不变性。(中文说的太绕嘴了,数学公式清晰)

\(U(D(X))=U(D(X_{shift}))\)

  • \(X_{shift}\)就是平移之后的输入;

举个例子:



这个就是\(U(D(X))\),



这个就是\(U(D(X_{shift}))\),可以发现两者并不相等,所以并没有平移不变性。

6 如何实现平移不变性

现在使用的全局平均池化层,就是可以实现平移不变性。依然是用上面的例子:



可以发现,其实不管平移多少,反正得到的数值都是一样的,全局平均池化消除了位置的影响,所以实现了平移不变性。

参考链接:

[1]https://zhangting2020.github.io/2018/05/30/Transform-Invariance/

[2]https://www.zhihu.com/question/36686900

[3]https://www.jianshu.com/p/6041f3e8a583





AI面试题之深入浅出卷积网络的平移不变性的更多相关文章

  1. 谷歌出品EfficientNet:比现有卷积网络小84倍,比GPipe快6.1倍

    [导读]谷歌AI研究部门华人科学家再发论文<EfficientNet:重新思考CNN模型缩放>,模型缩放的传统做法是任意增加CNN的深度和宽度,或使用更大的输入图像分辨率进行训练,而使用E ...

  2. 全卷积网络(FCN)实战:使用FCN实现语义分割

    摘要:FCN对图像进行像素级的分类,从而解决了语义级别的图像分割问题. 本文分享自华为云社区<全卷积网络(FCN)实战:使用FCN实现语义分割>,作者: AI浩. FCN对图像进行像素级的 ...

  3. 基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法

    基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法 Siamese CNN Temporally Constrained Metrics T ...

  4. 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"

    [深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...

  5. PRML读书会第五章 Neural Networks(神经网络、BP误差后向传播链式求导法则、正则化、卷积网络)

    主讲人 网神 (新浪微博:@豆角茄子麻酱凉面) 网神(66707180) 18:55:06 那我们开始了啊,前面第3,4章讲了回归和分类问题,他们应用的主要限制是维度灾难问题.今天的第5章神经网络的内 ...

  6. 学习笔记TF028:实现简单卷积网络

    载入MNIST数据集.创建默认Interactive Session. 初始化函数,权重制造随机噪声打破完全对称.截断正态分布噪声,标准差设0.1.ReLU,偏置加小正值(0.1),避免死亡节点(de ...

  7. 全卷积网络 FCN 详解

    背景 CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015年之前还是一个世界难题.神经网络大神Jonathan Long发表了<Fully Convolutional N ...

  8. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

  9. 深度卷积网络(DCNN)和人类识别物体方法的不同

    加州大学洛杉矶分校在PLOS Computing Biology上发表了一篇文章,分析了深度卷积网络(DCNN)和人类识别物体方法的不同:深度卷积网络(DCNN)是依靠物体的纹理进行识别,而人类是依靠 ...

随机推荐

  1. nginx在windows系统中启动、重启、停止,常用命令

    cmd终端在进入到nginx的安装目录下使用对应命令 查看nginx的版本号:nginx -v 启动nginx:start nginx 快速停止或关闭nginx:nginx -s stop 正常停止或 ...

  2. ps学习。

    ps软件及教程,这些东西,你应该要花一辈子来消化.

  3. Java 重写hashCode()与equals()

    为什么要重写hashCode() 和 equals() equals() 默认的Object类里面equals()方法是根据对象所在的内存来做判断的,如果两个对象引用指向的是同一个内存,则返回true ...

  4. bug和测试报告思维导图

    Bug定义: 1.不符合需求的 2.程序本身的报错 3.不符合用户使用习惯的 Bug生命周期: 当我们测试人员提交一个bug的时候,自始bug就有它的生命周期,从开始到结束, 把测试的过程和结果写成文 ...

  5. python黑帽子之udp客户端

    将上文的TCP客户端简单修改便能得到UDP客户端 import socket target_host = "127.0.0.1" target_port = 80 client = ...

  6. Spring Boot2.x 的Druid连接池配置[附带监控]

    父依赖[Spring Boot 2.1.x版本] <parent> <groupId>org.springframework.boot</groupId> < ...

  7. hive的简单操作语句

    **1.create table**1.1创建分区表create [external] table [if not exists] dcx1234(    cookieid string,    cr ...

  8. node实现文件属性批量修改(文件名)

    前言 书接上回,我们实现了批量修改文件的时间,但是却没有实现文件名称的批量修改,是因为我也说过,没有界面的话直接在命令行实现显得有点繁琐,所以我们就通过接口+界面的方式来实现我们这个小需求吧.所以,闲 ...

  9. ie浏览器不支持多行隐藏显示省略号

    平时在写页面过程中,相信大家都遇到过文本显示多行后用省略号代替的问题,来看看代码: p{ display: -webkit-box; overflow: hidden; text-overflow: ...

  10. sql语句-如何在SQL以一个表中的数据为条件据查询另一个表中的数据

    select *from 表2where 姓名 in (select 姓名from 表1where 条件) 这个就是用一个表的查询结果当作条件去查询另一个表的数据