用于细粒度零样本学习的堆叠语义引导注意力模型
Stacked Semantics-Guided Attention Model for Fine-Grained Zero-Shot Learning

本文亮点:使用语义引导视觉特征,加权不同的区域特征。

论文地址
代码地址


Abstract: Zero-Shot Learning (ZSL) is achieved via aligning the semantic relationships between the global image feature vector and the corresponding class semantic descriptions. However, using the global features to represent fine-grained images may lead to sub-optimal results since they neglect the discriminative differences of local regions. Besides, different regions contain distinct discriminative information. The important regions should contribute more to the prediction. To this end, we propose a novel stacked semantics-guided attention (S2GAS^2GAS2GA) model to obtain semantic relevant features by using individual class semantic features to progressively guide the visual features to generate an attention map for weighting the importance of different local regions. Feeding both the integrated visual features and the class semantic features into a multi-class classification architecture, the proposed framework can be trained end-to-end. Extensive experimental results on CUB and NABird datasets show that the proposed approach has a consistent improvement on both fine-grained zero-shot classification and retrieval tasks.

零样本学习是通过对齐全局图像特征向量和对应的类别语义描述之间的语义关系实现的。然而,使用全局特征来表示细粒度图像可能会导致次优结果,因为这种表示忽略了局部区域的判别性差异。除此之外,不同区域包含了不同的判别性信息。重要的区域对预测结果贡献更大。为此,我们提出了一种新颖的堆叠语义引导注意力S2GAS^2GAS2GA)模型,通过使用单独的类别语义特征来逐步引导视觉特征,生成一个用于衡量不同局部区域重要性的注意力图来获得语义相关特征。将集成的视觉特征和类别语义特征输入到多分类架构中,对提出的框架进行端到端的训练。在CUB和NABird数据集上的大量实验结果表明,所提出的方法在细粒度零样本分类和检索任务方面都有一致的提升。

亮点:使用加权局部特征来执行ZSL任务
结论1: 细粒度图像的视觉特征应该使用局部(细粒度)特征,而不是全局特征,来增加它的判别性
结论2:不同局部特征对最终的预测贡献不同。而对于不同的预测任务,不同局部区域的贡献应该也不同。也就是说,对于细粒度分类任务和细粒度ZSL任务来说,不同区域的贡献也是不同的。
结论3:因为ZSL任务是通过视觉语义的语义关系对齐实现的,所以不同区域的重要性是指它们对这个对齐的重要性。也就是说哪个区域对视觉语义映射重要,它就对ZSL任务重要。而区域特征是视觉特征,它对视觉语义映射重要,也就是要让这个特征经过映射能够更好地实现分类。论文的想法是,使得局部特征和语义相关,局部特征和语义相关性越大,那么它在最终的预测过程中,就能更准确的映射到类别语义描述上。

问题:1)attention map 是什么?PI
     2)individual怎么翻译?单独的类


问题定义

细粒度零样本问题。

如图1所示,全局特征仅捕获一些整体信息,相反,区域特征捕获局部信息,并且局部特征与类别语义描述更相关。

Motivation:当试图识别未见类别图像时,人们更多关注基于关键类别语义描述的信息区域。此外,人类通过排除不相关的视觉区域并以渐进的方式定位最相关的视觉区域来实现语义对齐。

零样本问题中,模型是如何学习已知类和未知类的关系的?
答:通过语义关系,具体来讲就是定义的语义空间,比如属性空间、词向量空间或者描述空间。已知类和未知类共享语义空间,如果已知类的视觉语义映射比较好的话,模型在未知类的的泛化性能就好。


方法

多层注意力机制

创新点:通过语义引导加权不同区域。

语义如何嵌入网络?

    f - 局部嵌入网络
输入:局部特征VIV_IVI
输出:隐空间的特征,f(VI)=h(WI,AVI)f(V_I)=h(W_{I, A} V_I)f(VI)=h(WI,AVI)
    g - 语义引导网络
输入:融合局部特征(全局)VGV_GVG + 类别语义向量sss
输出:g(VG)=h(WG,Ah(WG,SVG))g(V_G)=h(W_{G, A}h(W_{G, S} V_G))g(VG)=h(WG,Ah(WG,SVG))

Fusion是什么操作?

hA=tanh(f(VI)⊕g(VG))(1)h_A=tanh(f(V_I) \oplus g(V_G)) \tag {1}hA=tanh(f(VI)g(VG))(1)

pI=softmax(WPhA+bP)(2)p_I=softmax(W_Ph_A+b_P) \tag {2}pI=softmax(WPhA+bP)(2)

hA∈Rd×mh_A \in R^{d \times m}hARd×m是隐含空间的融合特征
VI∈Rp×mV_I \in R^{p \times m}VIRp×m 是区域特征,mmmppp维的区域特征向量
VG∈RpV_G \in R^pVGRp  是全局特征
⊕\oplus表示按像素乘法,论文里讲是f(VI)f(V_I)f(VI)的每列和g(VG)g(V_G)g(VG)每个元素相乘。

代码里是矩阵加

pI∈Rmp_I \in R_mpIRm是不同区域的权值(概率)

f(VI)=h(WI,AVI)(3)f(V_I)=h(W_{I, A} V_I) \tag {3}f(VI)=h(WI,AVI)(3)

g(VG)=h(WG,Ah(WG,SVG))(4)g(V_G)=h(W_{G, A}h(W_{G, S} V_G)) \tag {4}g(VG)=h(WG,Ah(WG,SVG))(4)

hhh是一个非线性函数(实验中使用ReLU),WI,A∈Rd×pW_{I, A} \in R^{d \times p}WI,ARd×p, WG,S∈Rq×pW_{G, S} \in R^{q \times p}WG,SRq×p, WG,A∈Rd×qW_{G, A} \in R^{d \times q}WG,ARd×q是要学的参数,其中,qqq是类别语义空间的维度,ddd是隐含空间的维度。


g(VG)=h(WG,Ah(WG,SVG))g(V_G)=h(W_{G, A}h(W_{G, S} V_G))g(VG)=h(WG,Ah(WG,SVG))的代码实现如下:

        seman_att = tf.expand_dims(att_seman_input,1)  # ① 增加维度seman_att = tf.tile(seman_att,tf.constant([1,self.part_num,1])) # ② 张量扩展seman_att = tf.reshape(seman_att,[-1,self.seman_dim])seman_att = tf.tanh(tf.matmul(seman_att,seman_att_W)+seman_att_b) # ③将预测属性投影到隐含空间

其中,seman_att对应h(WG,SVG)h(W_{G, S}V_G)h(WG,SVG),是全局特征VGV_GVG扩展后的的预测属性。part_num * hidden_dim

guided loss

min⁡LossG=∣∣h(WG,S,VG)−s∣∣(5)\min Loss_G=|| h(W_{G, S}, V_G) - s || \tag {5}minLossG=h(WG,S,VG)s(5)
为了将类别语义信息嵌入到注意力网络,ggg网络的第二层的输出强制靠近对应的类别语义特征。


数据

输入:2个鸟类数据集。

  •  属性数据集—CUB   : 200类,11,788张图片,每类312维属性。
  • 非属性数据集—NABirds:1011类,48,562张图片。

类别语义特征有三种:属性、词向量Word2Vec、TF-IDF词频-逆文件频率。
训练时,TF-IDF通过PCA降维,CUB-200维,NABirds-400维。

输出:分类准确率

实验1——最高精度对比实验,CUB

实验分析:论文方法和[1]用的是局部特征,其他方法用的是全局特征。

实验2——相同设置对比实验,CUB+NABird

实验分析:SCE设置下,超类不共享,小类别之间的相关性最小,知识迁移更难,更具挑战,所以效果更差。

实验3:——语义空间对比实验,CUB

实验分析:

  1. 局部特征比全局特征更具有判别性
  2. 属性特征比词向量语义信息丰富

实验4——注意力实验,CUB+NABird

实验分析:两层注意力性能最高


实验5:——ZSL 检索,CUB+NABird

实验分析:

  1. 零样本检索的任务是:在未见类数据集中检索与未见类的指定类别语义描述相关的图像。
    The task of zero-shot retrieval is to retrieve the relevant images from unseen class set related to the specified class semantic descriptions of unseen classes.
  2. 检索任务的可视化结果发现,性能好的类别,他们的类内变化很微小;性能差的类别,他们的类间变化很小。
     例如,
    第一行,“靛青鸟”的前6个检索图像都来自标注类别;因为他们的视觉特征相似。
    第二行,请求“黑嘴杜鹃”检索到一些实例来自它的姻亲“黄嘴杜鹃”,因为他们的视觉特征太像了没法区分。

总结

  • 使用堆叠注意力,从表3看,注意力的收益是6.4%(CUB数据集)

问题1: 零样本学习中,有没有验证集?训练流程是怎样的?训练集阶段和测试阶段是怎么使用数据的?
  1)没有,只有训练集和测试集。
  2)先在训练集上进行训练模型,得到模型后直接在测试集上进行测试。
  3)训练集被分为不同的batch,每次随机取batch然后训练模型,进行多次迭代;测试时对所有样本进行预测,计算精度。

问题2: seman和seman_pro区别?
  seman–样本语义;seman_pro–类别语义。



2019/8/13
本文数据来自ZSL_PP_CVPR17,其中有CUB和NABird两个数据集的语料库语义(TF-IDF),本文对两个数据集TF-IDF进行了pca降维,分别降到200和400维。实验验证:在MATLAB 2017a,pca和princomp是有区别的,pca对CUB的数据返回的协方差矩阵只包含前199维,而princomp能返回所有维。

[c,s]=pca(PredicateMatrix);


[c,s]=princomp(PredicateMatrix);

参考:

  1. 西瓜书229
  2. 机器学习算法系列(22):主成分分析

收录经典的PCA代码(某大牛实现的):

PCA.m

function [eigvector, eigvalue] = PCA(data, options)
%PCA    Principal Component Analysis
%
%   Usage:
%       [eigvector, eigvalue] = PCA(data, options)
%       [eigvector, eigvalue] = PCA(data)
%
%             Input:
%               data       - Data matrix. Each row vector of fea is a data point.
%
%     options.ReducedDim   - The dimensionality of the reduced subspace. If 0,
%                         all the dimensions will be kept.
%                         Default is 0.
%
%             Output:
%               eigvector - Each column is an embedding function, for a new
%                           data point (row vector) x,  y = x*eigvector
%                           will be the embedding result of x.
%               eigvalue  - The sorted eigvalue of PCA eigen-problem.
%
%   Examples:
%           fea = rand(7,10);
%           options=[];
%           options.ReducedDim=4;
%           [eigvector,eigvalue] = PCA(fea,4);
%           Y = fea*eigvector;
%
%   version 3.0 --Dec/2011
%   version 2.2 --Feb/2009
%   version 2.1 --June/2007
%   version 2.0 --May/2007
%   version 1.1 --Feb/2006
%   version 1.0 --April/2004
%
%   Written by Deng Cai (dengcai AT gmail.com)
%if (~exist('options','var'))options = [];
endReducedDim = 0;
if isfield(options,'ReducedDim')ReducedDim = options.ReducedDim;
end[nSmp,nFea] = size(data);
if (ReducedDim > nFea) || (ReducedDim <=0)ReducedDim = nFea;
endif issparse(data)data = full(data);
end
sampleMean = mean(data,1);
data = (data - repmat(sampleMean,nSmp,1));[eigvector, eigvalue] = mySVD(data',ReducedDim);
eigvalue = full(diag(eigvalue)).^2;if isfield(options,'PCARatio')sumEig = sum(eigvalue);sumEig = sumEig*options.PCARatio;sumNow = 0;for idx = 1:length(eigvalue)sumNow = sumNow + eigvalue(idx);if sumNow >= sumEigbreak;endendeigvector = eigvector(:,1:idx);
end

mySVD.m

function [U, S, V] = mySVD(X,ReducedDim)
%mySVD    Accelerated singular value decomposition.
%   [U,S,V] = mySVD(X) produces a diagonal matrix S, of the
%   dimension as the rank of X and with nonnegative diagonal elements in
%   decreasing order, and unitary matrices U and V so that
%   X = U*S*V'.
%
%   [U,S,V] = mySVD(X,ReducedDim) produces a diagonal matrix S, of the
%   dimension as ReducedDim and with nonnegative diagonal elements in
%   decreasing order, and unitary matrices U and V so that
%   Xhat = U*S*V' is the best approximation (with respect to F norm) of X
%   among all the matrices with rank no larger than ReducedDim.
%
%   Based on the size of X, mySVD computes the eigvectors of X*X^T or X^T*X
%   first, and then convert them to the eigenvectors of the other.
%
%   See also SVD.
%
%   version 2.0 --Feb/2009
%   version 1.0 --April/2004
%
%   Written by Deng Cai (dengcai AT gmail.com)
%                                                   MAX_MATRIX_SIZE = 1600; % You can change this number according your machine computational power
EIGVECTOR_RATIO = 0.1; % You can change this number according your machine computational powerif ~exist('ReducedDim','var')ReducedDim = 0;
end[nSmp, mFea] = size(X);
if mFea/nSmp > 1.0713ddata = X*X';ddata = max(ddata,ddata');dimMatrix = size(ddata,1);if (ReducedDim > 0) && (dimMatrix > MAX_MATRIX_SIZE) && (ReducedDim < dimMatrix*EIGVECTOR_RATIO)option = struct('disp',0);[U, eigvalue] = eigs(ddata,ReducedDim,'la',option);eigvalue = diag(eigvalue);elseif issparse(ddata)ddata = full(ddata);end[U, eigvalue] = eig(ddata);eigvalue = diag(eigvalue);[dump, index] = sort(-eigvalue);eigvalue = eigvalue(index);U = U(:, index);endclear ddata;maxEigValue = max(abs(eigvalue));eigIdx = find(abs(eigvalue)/maxEigValue < 1e-10);eigvalue(eigIdx) = [];U(:,eigIdx) = [];if (ReducedDim > 0) && (ReducedDim < length(eigvalue))eigvalue = eigvalue(1:ReducedDim);U = U(:,1:ReducedDim);endeigvalue_Half = eigvalue.^.5;S =  spdiags(eigvalue_Half,0,length(eigvalue_Half),length(eigvalue_Half));if nargout >= 3eigvalue_MinusHalf = eigvalue_Half.^-1;V = X'*(U.*repmat(eigvalue_MinusHalf',size(U,1),1));end
elseddata = X'*X;ddata = max(ddata,ddata');dimMatrix = size(ddata,1);if (ReducedDim > 0) && (dimMatrix > MAX_MATRIX_SIZE) && (ReducedDim < dimMatrix*EIGVECTOR_RATIO)option = struct('disp',0);[V, eigvalue] = eigs(ddata,ReducedDim,'la',option);eigvalue = diag(eigvalue);elseif issparse(ddata)ddata = full(ddata);end[V, eigvalue] = eig(ddata);eigvalue = diag(eigvalue);[dump, index] = sort(-eigvalue);eigvalue = eigvalue(index);V = V(:, index);endclear ddata;maxEigValue = max(abs(eigvalue));eigIdx = find(abs(eigvalue)/maxEigValue < 1e-10);eigvalue(eigIdx) = [];V(:,eigIdx) = [];if (ReducedDim > 0) && (ReducedDim < length(eigvalue))eigvalue = eigvalue(1:ReducedDim);V = V(:,1:ReducedDim);endeigvalue_Half = eigvalue.^.5;S =  spdiags(eigvalue_Half,0,length(eigvalue_Half),length(eigvalue_Half));eigvalue_MinusHalf = eigvalue_Half.^-1;U = X*(V.*repmat(eigvalue_MinusHalf',size(V,1),1));
end

用这份代码的降维结果和本文提供的降维结果非常一致。

[NIPS 2018] Stacked Semantics-Guided Attention Model for Fine-Grained Zero-Shot Learning相关推荐

  1. NIPS 2018 接收论文list 完整清单

    NIPS2018 接收论文包括poster.tutorial.workshop等,目前官网公布了论文清单: https://nips.cc/Conferences/2018/Schedule Post ...

  2. NIPS 2018 迁移学习相关论文

    文章目录 [NIPS2018](https://nips.cc/Conferences/2018/Schedule) Unsupervisedly Learned Latent Graps as Tr ...

  3. 【NIPS 2018】完整论文下载链接

    NeurIPS2018的论文已经开放下载,本文总结了论文的pdf页面.直接点击对应论文即可访问对应的pdf下载页面. 如果希望Batch->所有论文链接 [1] Efficient Algori ...

  4. Multi-Decoder Attention Model with Embedding Glimpse for Solving Vehicle Routing Problems 学习笔记

    文章目录 摘要 零.一些基础 1.波束搜索(Beam Search) 2.Glimpse层 一.介绍 二.相关工作 三.模型 1.多译码器注意力模型和搜索(Multi-Decoder Attentio ...

  5. 以Attention Model为例谈谈两种研究创新模式

    在研读AttentionModel相关文献过程中,我再次深切感受到了科研中的两种创新模式:模型创新与应用创新.若干年前,也就是在我年轻不懂事的花样年华里,具体而言,就是在科学院读博士的后期,这种感受就 ...

  6. 清华朱文武团队斩获NIPS 2018 AutoML挑战赛亚军,高校排名第一

    来源:新智元 本文约2000字,建议阅读10分钟. 本文介绍了NIPS 2018 AutoML挑战赛的最终结果,清华大学计算机系朱文武团队斩获第二,高校排名雄踞第一. NIPS 2018 AutoML ...

  7. Attention Model(注意力模型)思想初探

    1. Attention model简介 0x1:AM是什么 深度学习里的Attention model其实模拟的是人脑的注意力模型,举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但 ...

  8. 【NLP】Attention Model(注意力模型)学习总结

    最近一直在研究深度语义匹配算法,搭建了个模型,跑起来效果并不是很理想,在分析原因的过程中,发现注意力模型在解决这个问题上还是很有帮助的,所以花了两天研究了一下. 此文大部分参考深度学习中的注意力机制( ...

  9. (转载)自然语言处理中的Attention Model:是什么及为什么

    转载说明来源:http://blog.csdn.net/malefactor/article/details/50550211 author: 张俊林 原文写得非常好! 原文: 要是关注深度学习在自然 ...

  10. NIPS 2018 论文解读集锦(11月28日更新)

    今年我们整理过视觉顶级会议CVPR 2018论文解读集锦 和 ECCV 2018论文解读集锦,并持续更新中,如今备受瞩目的NIPS 2018也将于12月举行,目前已经公布了所有收录论文名单,为了能够让 ...

最新文章

  1. 第十三周项目二-动物这样叫(1)
  2. 数据结构——二叉树的遍历
  3. JavaScript DOM操作 提高篇
  4. 前端学习(2521):设定添加博客和最终效果展示
  5. 浏览器端判断当前设备的运行环境
  6. 牛顿法python代码_python 牛顿法实现逻辑回归(Logistic Regression)
  7. python matplotlib_高效使用 Python 可视化工具 Matplotlib
  8. iOS开发-View中frame和bounds区别
  9. Dom对象与jQuery对象的转换
  10. 面向接口编程(面向协议编程)
  11. python免费使用谷歌翻译的方法
  12. linkinfo.dll 病毒,烦!
  13. Linux和Windows中下载FFmpeg
  14. 127.0.0.1 192.168 localhost 之间的区别
  15. 使用插件实现ecplise js/jquery智能提示
  16. 【Scratch-外观模块】背景切换指令
  17. SQLZOO刷题笔记
  18. 论MathType中空格的正确的输入方法
  19. access导出mysql数据库_如何从ACCESS数据库导出数据
  20. [考研]考研倒计时第10天

热门文章

  1. Python网络爬虫(二):小说下载器
  2. AD再见--AdGuardHome神器
  3. 项目风险管理__常见题
  4. 什么是混合移动App开发【重点学习系列---干货十足--一文详解】
  5. 2018年最值得投资的十大行业版图
  6. 如何找到生日中阴阳历重合的年份
  7. Intel CPU的型号漫谈
  8. 手绘几何图形识别(下)
  9. BI 工具常用图表用法
  10. 远程计算机打印,教你玩转远程终端打印机