论文:SCA-CNN: Spatial and Channel-wise Attention in Convolutional Networks for Image Captioning
链接:https://arxiv.org/abs/1611.05594
Github代码:https://github.com/zjuchenlong/sca-cnn

这篇是CVPR2017的文章,主要介绍在网络的multi-layer上用channel wise attention和spatial attention结合的方式来做image caption(图像标注)。attention机制的本质是训练一个权重,然后这个权重可以用来对channel做选择或者叠加在feature map的每个像素点上,比如分类网络中的SE-Net就是采用的训练权重对feature map的channel做选择的方式。直观上的理解就是不管是图像分类还是图像标注,每次网络的关注点(attention)可能只是图像中的一小部分,这也就是文中作者说的人类的视觉系统其实可以看做是一种dynamic feature extraction mechanism(动态的特征提取机制),因此如果能在模型关注某个部分的时候都强调这个部分的话,对于模型效果的提升是有帮助的,这就是attention训练得到的weight的作用。attention机制在image caption上的应用应该可以追溯到ICML2015的这篇:Show, Attend and Tell: Neural Image Caption Generation with Visual Attention文章,不过在那篇文章中主要对网络的最后一个卷积层采用spatial attention, 显然作者认为这种spatial attention并不完全符合attention机制,因为CNN features are naturally spatial, channel-wise and multi-layer。所以就有了在multi-layer feature map上结合channel wise attention和spatial attention两种attention做image caption的方式。

既然要在spatial attention的基础上引入multi-layer思想和channel wise attention,那么就要看看效果怎么样。Figure1是采用channel wise attention方法处理网络的某些层(比如VGG19网络中的conv5_3和conv5_4层)后的可视化效果。选取其中权重最大的3个channel的feature map并可视化,同时展示了每个channel的feature map对应的5张图像中感受野的响应最大的区域。
为什么要引入channel wise attention?channel wise attention的本质是什么呢?举个例子:当你要预测cake时,那么channel wise attention就会使得提取到cake特征的卷积核生成的feature map的权重加大。因此作者在文中将channel wise attention总结为semantic attention,semantic attention的内容可以参看CVPR2016的论文:Image captioning with semantic attention。
为什么要引入multi-layer呢?因为高层的feature map的生成是依赖低层的feature map的,比如你要预测cake,那么只有低层卷积核提取到更多cake边缘特征,高层才能更好地抽象出cake。另外如果只在最后一个卷积层做attention,其feature map的receptive field已经很大了(几乎覆盖整张图像),那么feature map之间的差异就比较小,不可避免地限制了attention的效果,所以对multi-layer的feature map做attention也是顺其自然的事。
另外顺便提下spatial attention的作用就是前面最早提到的,不管是图像分类还是图像标注,每次网络的关注点(attention)可能只是图像中的一小部分,spatial attention则可以实现为关键部分配更大的权重,让模型的注意力更集中于这部分内容。

仔细体会,可以看出channel wise attention是在回答“是什么”,而spatial attention是在回答“在哪儿”,二者是不一样的。

Figure2是SCA-CNN的整体图,还是采取的经典的encoder-decoder结构,主要包含CNN网络(encoder)和LSTM网络(decoder)两部分。CNN网络包含spatial attention和channel wise attention两种attention操作。spatial attention可以理解以feature map的每个像素点为单位,对feature map的每个像素点都配一个权重值,因此这个权重值应该是一个矩阵;channel wise attention则是以feature map为单位,对每个channel都配一个权重值,因此这个权重值应该是一个向量。这两种attention操作的输入输出分别如下面的公式3和4所示,下标s代表spatial attention函数,下标c表示channel wise attention函数,Vl是feature map,ht-1是LSTM生成的。

LSTM网络的计算过程如公式2所示。其中ht-1是已经预测得到的描述词,ht是将要预测的词,XL是CNN网络的输出(其中L是CNN网络的卷积层数目),pt是一个概率向量(pt的维度是|D|,D是预先定义的包含所有描述单词的字典)。

因此整个网络的流程(可以结合Figure2)可以分为CNN网络将输入图像encode成feature map和LSTM网络将feature mapdecode成词序列这两步:1、一张待描述的图像输入给CNN网络,在CNN网络的多个层的feature map上执行上述两种attention操作。具体而言是这样的:首先Vl是网络中第(l-1)层的输出feature map,该feature map经过channel wise attention 函数(前面的公式4)得到权重 βl。然后这个βl和Vl相乘就得到中间结果的feature map。接下来feature map经过spatial attention函数(前面的公式3)得到权重 αl。这个αl和前面生成的feature map相乘得到最终的Xl。2、CNN网络的输出以及已经预测得到的部分描述句子作为LSTM网络的输入,得到描述句子的下一个单词。

前面只介绍了channel wise attention和spatial attention函数的输入输出,并没有介绍这两个函数的实际计算公式,那么到底这两种attention是怎么计算的?

Channel wise Attention函数的具体计算过程如公式7所示,可以和前面的公式4一起结合看。解释下维度,v=[v1,v2,…,vc],v是c维的向量。Wc*v是k*c的矩阵,因此b也是k*c的矩阵,所以W`ib是1*c的向量,β也是1*c的向量。因此β的每个值表示channel数为c的feature map的每个channel的权重。

Spatial Attention函数的具体计算过程如公式5所示,可以和前面的公式3一起结合看。解释下维度,V=[v1,v2,…,vm],vi是C维的向量,m=WH(长宽的乘积),那么WsV的维度就是k*m,WsV+bs的维度也是k*m,然后再和一个向量(Whsht-1)相乘得到a,a的维度还是k*m。Wia的维度是1*m,是一个向量,所以α也是维度为1*m的向量。因此α的每个值表示feature map中每个点的权重(一共WH=m个点)。

根据两种attention的先后顺序不同可以组合出两种处理形式,第一种如公式8所示,先进行channel wise attention,再进行spatial attention,其中fc函数表示channel wise multiplication,简单讲就是用一个维度和输入feature map的channel数相同的向量和feature map的channel相乘。

实验结果:
由前面的介绍可知本文的创新点在于一方面引入channel wise attention,另一方面在于在multi-layer上进行attention操作,因此实验方面先分别验证这两个创新点的效果,最后再和其他优秀算法做对比

实验主要在三个数据集Flickr8K、Flickr30K、MSCOCO上进行。CNN网络采用两种常用的网络:VGG-19和ResNet-152。

首先是channel wise attention的效果,可以看Table1。Table1是在不同数据集和不同主网络上的实验对比。在Method一列中,S表示只采用spatial attention、C表示只采用channel wise attention、S-C表示先进行spatial attention再进行channel wise attention、C-S表示先进行channel wise attention再进行spatial attention、SAT表示论文“Show, ttend and tell: Neural image caption generation with visual attention”中的模型。在S和C的具体操作中,是对最后一个卷积层的输出feature map进行相应的attention操作,然后用得到的weights对输出feature map进行加权得到新的feature map输出,新的feature map再过网络后面的层(VGG中是全连接层,ResNet中是global average pooling)。

从Table1中可以得到几个结论:1、方法S在VGG网络的表现要优于SAT,但是在ResNet网络上的表现要劣于SAT。主要原因在于在VGG网络中,加权后的feature map经过的是全连接层,全连接层不会丢失空间信息;而在ResNet网络中,加权后的feature map经过的是pooling层,会丢失空间位置信息。2、和方法S相比,方法C在ResNet上的表现要远远好于VGG网络,主要原因是前者的最后一个卷积层有更多的channel输出,这样有利于channel wise attention提升效果。3、C-S和S-C的结果比较相近,但是C-S的效果会更好一点。

然后是multi-layer的效果,如下面的Table2和Table3所示。For VGG-19, 1-st layer, 2-nd layer, 3-rd layer represent conv5_4; conv5_3; conv5_2 conv-layer, respectively. As for ResNet-152, it represents res5c; res5c_branch2b; res5c_branch2a conv-layer. 从Table2和Table3可以看出总体上multi-layer的效果确实比单层的效果要好一些,但是同时层数过多的话也容易引起过拟合。

最后是SCA-CNN算法和其他image caption算法的实验对比,如Table4和Table5所示。其中Deep VS,m-RNN,Google NIC都是结合CNN和RNN的端到端网络;Soft-Attention和Hard-Attention是spatial attention模型;emb-gLSTM和ATT是semantic attention模型。在Table5中SCA-CNN的表现不如ATT和Google NIC,作者认为主要原因在于后二者都采用了模型融合的方式,一般而言融合的效果会优于单模型,只不过速度是劣势,可惜文中没有速度上的对比,不知道速度差异如何。

最后的最后奉上图像描述的效果图。

SCA-CNN算法笔记相关推荐

  1. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR

    原地址可以查看更多信息 本文主要参考于:Classifying MNIST digits using Logistic Regression  python源代码(GitHub下载 CSDN免费下载) ...

  2. 算法笔记知识点整理大全

    每次刷题都觉得自己吃了知识点不全,基础不牢固的亏,刷题的时候目标也不明确,于是看完了算法笔记并把知识点归纳了一下,当然直接看书会更加详细,这个归纳只是学习时加深印象以及方便自己之后回顾而已:之后刷题大 ...

  3. 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...

    来源:专知本文为资源,建议阅读5分钟本文为你分享<算法笔记>中文版. https://github.com/Dairongpeng/algorithm-note 目录概览 第一节 复杂度. ...

  4. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

  5. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  6. 数据结构与算法笔记(十五)—— 散列(哈希表)

    一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...

  7. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP

    原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron  python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...

  8. DL之CNN:利用CNN算法实现对句子分类+进行情感分析(预测句子情感)

    DL之CNN:利用CNN算法实现对句子分类+进行情感分析(预测句子情感) 目录 CNN算法设计思路 代码实现 CNN算法设计思路 b 代码实现 后期更新--

  9. DL之LiRDNNCNN:利用LiR、DNN、CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测

    DL之LiR&DNN&CNN:利用LiR.DNN.CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测 目录 输出结果 设计思路 核心代码 输出结果 数据集:Da ...

  10. 《algorithm-note》算法笔记中文版正式发布!

    无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...

最新文章

  1. 真我新格调 勇敢使梦想×××
  2. dynamo方程怎么写_根据以下说明,画出因果关系图,建立流图模型,并拟定变量名称和适当数据,写出对应的...
  3. 上海电信计划2015年用户带宽提高12.5倍
  4. java中大数开方_Java中的大数运算
  5. go语言学习(基本数据类型)
  6. Windows下安装苹果iPhone开发环境xcode图文教程
  7. php 双向队列,PHP实现一个双向队列
  8. magento图片处理 Customize Magento’s Image Resize Functionality
  9. php可逆加密函数,简洁的PHP可逆加密函数
  10. 文件系统与linux相关知识点
  11. Asp.Net数据控件遍历
  12. 电脑端微信用户图片DAT格式解码为图片(TK版)
  13. 导出的CSV数据中含有身份证并在Excel正确显示方法
  14. (一)数据分析——企业的贤内助(数据分析的价值)
  15. python时间函数纳秒_python 纳秒
  16. 如何使用unirest
  17. 上线MSF(Metasploit)的几种常见方式
  18. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: FUNCTION security.to_date does not exist
  19. 65 ---- 点到平面、点到直线 及异面直线间的距离
  20. natapp九折邀请码

热门文章

  1. docker swam
  2. 招聘·全球物流信息查询SaaS服务公司
  3. Rockset:最具潜力、最值得加入的大数据初创公司
  4. C#语言入门、xamarin基础、.NET MAUI全栈开发技术综合笔记
  5. 零基础学python大概要多久-零基础学python大概要多久
  6. linux查看硬盘命令 ok,linux查看硬件信息大全
  7. python语句和语法介绍
  8. RPLIDAR思岚雷达学习记录--4--雷达数据实时保存
  9. 开发者实践丨Agora Home AI 音视频的未来
  10. python如何随机生成一个整数_Python生成随机数的方法