这是2016年CVPR上的一篇文章。对后来的弱监督学习的研究有很大的启发。这篇文章非常简单,主要是通过一系列的实验,证明了两个结论:1)CNN提取的feature含有位置信息,尽管我们在训练的时候并没有标记位置信息;2)这些位置信息,可以转移到其他的认知任务当中。
首先,我想给大家先科普一下global average pooling(GAP)
我们都知道,一个卷积神经网络中都有很多卷积层,一般情况下都是 “卷积(可以多个)--池化” 这种的组合,而卷积层有 通道(channel),卷积核(kernel)的宽、高这些参数,故而每个卷积层都将有个数为 channel 多个的输出,这些输出都有一个宽和高,我们将这个输出叫做(feature map),现在我们只需将池化的核大小设为这些输出的宽和高即可,那么得到的就是一个个的数对吧,共有该卷积层的number of channel 这么多个。
就是说我们看到下图GAP的左右,左边的蓝红绿那个feature map是在其左边那个最小的卷积层做了上采样得到的输出(feature map),一共有N个(N = number of channel),我们对其做全局平均池化(global average pooling),就是将蓝色的那个feature map做一下均值得到一个结果,当然你也可以做GMP,就是将最大值作为输出,这个结果就是箭头右边的蓝色圆圈
好了言归正传,我们知道,在用神经网络来做分类的时候,一个模型往往都是多个 “卷积(可以多个)--池化” 后接全连接,那么现在,我们用同样的方式,最后面来一个全连接吧,神经元个数就是你要分类的类别数量,好了,这就可以训练了,完了就会得到你想要的结果。
这时候啊,该论文作者就想了,GAP不仅仅是一个regularizer啊,你想想看,貌似它还可以将卷积层的定位能力一直延伸到最后一层,那我们是不是可以以此将feature map上那些比较惹人注意的地方区分出来呢,答案是可以的,就比如上图,我问你那人手里是狗还是猫时,你看的哪儿呢?显然,你会更加注意狗,我们说这一块具有区分性(discriminative)的区域激活值就比较大,
现在,作者开始了,构建了一个上述的结构,在全连接前加了一个GAP层,其他和普通网络一样,假设你分类出了某个输入是一个类别,比如是狗吧,最后的第二个神经元得出的结果最大,那么我们就取出GAP和它连起来的weight,然后用此weight我们去和GAP之前颜色为蓝绿红那个feature map做一下加权平均,最终就得到了我们所说的类激活映射图(Class Activation Map),但是这儿我们拿到的Class Activation Map是这条狗的啊,但是有些花痴觉得那个男孩儿长的挺不错的,那她们肯定注意更多的反而是这个男孩儿对吧,怎么办呢?一样的嘛,你把分类男孩儿那个神经元的weight抓出来加权平均不就完了,像这样:
你看看吧,对于palace,我们更多的就是去看的建筑本身的轮廓和城墙上的结构,比如窗户啊啥的,但是对于church,那我们就关注那个尖尖的建筑了。
总结一下吧,其实神经网络中每个神经元看到的东西都是不一样的,它们分工明确,有的检测的是比如边缘、角点这种低级的视觉特征,有的则负责检测物体、场景这种比较高端的,最终它们把这些综合一下就得到了分类结果。我们可以把最后一个卷积层看成是一个词典。每一张feature map对应检测输入中的一个单词,如果有,就在对应位置有高的激活值。后面的全连接层其实就是利用这个词典进行分类。比如对于自行车分类器,他对于车轮,车把,车座这三个单词会赋予高的权值,对其他的单词权值很低,那么当他检测到输入图片的词向量在车轮,车把,车座这三个单词的置信度很高的时候,就会把这张图判断成自行车。
但就这个文章而言,其弊端还是比较明显的,比如我有下面这个图
你注意到的是花还是鸟呢?
如果我们并未对花进行分类,那你将取哪个神经元的weight作为你CMP加权平均的weight呢?
参考:https://zhuanlan.zhihu.com/p/27587399
http://blog.csdn.net/yaoqi_isee/article/details/62214648