Bi-modal progressive mask attention for fine-grained recognition
用于细粒度识别的双模态渐进掩模注意
摘要 传统的细粒度图像识别需要根据原始图像下的视觉线索来区分不同的下属类别(如鸟类物种)。由于小的类间变化和大的类内变化,最好能捕捉到这些子类别之间的细微差别,这对五线谱识别来说是至关重要但又具有挑战性的。最近,语言模式聚合已经被证明是一种成功的技术,可以改善经验中的视觉识别。在本文中,我们引入了一个端到端的可训练的渐进式掩码注意(PMA)模型,通过利用视觉和语言模态来实现五维识别。我们的双模态PMA模型不仅可以通过我们基于面具的方式分阶段捕捉视觉模态中最具辨别力的部分,而且还可以在交互式对齐范式中探索来自语言模态的视觉以外的领域知识。具体来说,在每个阶段,我们提出了一个自我注意模块,以关注图像或文本描述中的关键片段。此外,还设计了一个查询关系模块,以抓住文本的关键词/短语,并进一步建立两种模式之间的联系。后来,从多个阶段学到的双模态表征被汇总为识别的最终特征。我们的双模态PMA模型只需要原始图像和原始文本描述,不需要图像中的边界框/部分注释或文本中的关键词注释。通过在五级基准数据集上进行全面的实验,我们证明了所提出的方法在视觉和语言双模态或单一视觉模态上都取得了优于比较基线的性能。
关键词 细粒度视觉识别 多模态分析 深度神经网络 语言模态。
1 引言
细粒度图像识别的任务是通过挖掘原始图像下的视觉线索来识别鸟类[1]、花[2]、汽车[3]和飞机[4]的种类。它已应用于多种现实场景,如生物保护[5]、[6]、车辆识别[7]、产品识别[8]等。由于从属类别都彼此相似,不同的子类别只能通过细微的差异来区分,这使得细粒度识别成为一个具有挑战性的问题。与一般的目标识别任务中相比,细粒度识别更有利于学习目标的关键部分,这有助于区分不同的子类别,并对齐同一子类别[9]、[10]、[11]的对象。
在本文中,我们提出了一种新的细粒度方法,称为渐进掩模注意(PMA),它探索了细粒度识别的双模态分析。PMA统一了一种渐进式掩模策略,可以同时友好地应用于视觉和语言模式,揭示了其灵活性和可扩展性。此外,与细粒度图像的强监督(如边界框和部分注释)相比,文本描述(如句子和短语)是弱监督,它们还可以提供视觉域无法显示的语义。此外,文本描述可以由普通人而不是领域专家相对准确地返回。为了应用我们的渐进掩模策略来解决细粒度识别问题,我们还提出了双模态渐进掩模注意(双模态PMA)模型。它可以从视觉流和文本流中获取关键信息。更具体地说,原始图像和文本首先由卷积神经网络和长-短期记忆网络分别处理为深度视觉描述符和名词短语嵌入。然后,将处理后的双模态表示输入到我们的双模态PMA中,以产生一个联合表示。在我们的双模态PMA中,一个自注意模块被设计用来从视觉或语言模态中提取语义。通过使用各种掩模模板,自我注意机制收集的语义可以用来定位视觉模态中的关键部分,或捕获语言模态中的视觉域外知识。此外,还设计了一个查询关系模块来连接从语言模态的关键字/短语到视觉模态的关键部分的连接。此外,由于所提出的注意方法,我们可以对齐两个模态的表示并获得更有区别和丰富的连接特征。然后,我们可以同时获得全局级图像特征、部分级图像表示、全局级文本特征和对齐的部分级文本表示。
除此之外,通过引入我们提出的渐进掩码策略,我们可以以逐阶段的方式堆叠多个PMA模块。我们的PMA是为细粒度识别量身定制的,它可以逐步参与一组不同的和不重叠的部分。它将显著提高最终的细粒度识别精度。具体地说,在PMA输出上一阶段的双模态的参与部分后,这些部分信息被视为下一阶段的输入。我们提出了一种基于面具的策略,即丢弃视觉中对象的定位部分,并同时过滤掉语言中定位部分的相关名词短语。由于最重要的图像区域和名词短语被省略了,PMA在那个阶段可以集中在视觉和语言的次要重要部分。在这种模式下,被丢弃的区域/短语将逐步扩展。因此,我们的方法可以以多阶段的方式迭代工作,这有利于细粒度识别。
此外,有时,我们可能会在下游任务中遇到一些没有任何文本级数据(即单模态)的场景。为了在这种情况下利用我们的模型(即,在没有文本信息的情况下进行模型推断),我们进一步开发了一种知识蒸馏方法,将我们的双模态PMA对双模态的泛化能力提炼为只能处理图像数据作为输入的学生模型。多亏了我们的蒸馏器,我们的学生模型能够仅用测试图像做出准确的预测,并且通过使用视觉和语言模式,几乎与我们的模型的准确性相匹配。
本文的主要贡献如下:
- 我们引入了一个统一的框架,称为渐进掩模注意,以结合视觉和语言模式的区别线索来处理细粒度识别任务。
- 我们专门为每个模态设计了一种基于注意力的方法来捕获重要的对象部分,以形成部分级的表示。此外,还开发了一种基于阶段面具的策略来堆叠这些注意单元。因此,整个模型可以逐步定位一组有区别但不同的关键部分,或利用文本描述来提供视觉领域外的知识。
- 我们进一步开发了一种知识蒸馏器,将视觉和语言模式的知识压缩到对象级模型中,它允许模型仅使用图像数据进行预测。
- 我们在四个细粒度的基准数据集上进行了全面的实验,我们提出的模型在双模态或单视觉模态上都取得了优于竞争解决方案的性能。
本文的其余部分组织如下:第二节回顾了以往在细粒度识别、多模态分析和注意机制方面的工作。第三节阐述了我们的视觉和语言模式的详细设计。第四节介绍了我们的实验设置,第五节报告了四个公共数据集以及消融研究的结果。最后,我们在第六节中总结了我们的工作。
2 相关工作
3 实现
在本节中,我们将通过阐述我们的双模态渐进掩模注意(双模态PMA)框架,详细介绍其两个关键模块,即基于视觉的PMA模块和基于语言的PMA模块。具体来说,双模态PMA是为了融合视觉和语言模式的信息在每个阶段都以一种互动的方式进行研究。而我们使用PMA逐步迭代地定位双模态的顶级判别部分和相关短语。图1显示了我们的双模态PMA模型的体系结构。
图1我们的双模态PMA模块的详细架构。左边的图是我们定义的组件“SAM”和“QRM”。“是加权和运算,“ ⊕ \oplus ⊕”是加法运算, δ ( ⋅ ) \delta(\cdot) δ(⋅)是非线性激活函数。子模块“参与并定位部分”是指根据最大注意权重 a i a_i ai来定位特征图中最具区别性的部分。红色虚线表示使用来自定位部分的压缩输出来查询语言模态,而语言模态的 z i z_i zi是短语嵌入的向量。在这里,我们展示了该特征图中的四个 2 × 2 2\times2 2×2块,作为一个简单而清晰的例子。
A.符号标记
在引言的开始,我们首先给出一些预定义的组件,它们将在下面的部分中使用。图1还说明了这些组件。
1)自我注意模块(SAM)
SAM是一个用于从单一模态中收集语义的组件。假设
x
∈
R
d
x\in R^d
x∈Rd为输入,则SAM的公式表示为
SAM
(
x
)
=
W
2
⋅
δ
(
W
1
⋅
x
)
(1)
\text{SAM}(x)=W_2\cdot \delta(W_1\cdot x) \tag{1}
SAM(x)=W2⋅δ(W1⋅x)(1)
其中
W
1
∈
R
d
×
d
r
W_1\in R^{d\times \frac{d}{r}}
W1∈Rd×rd和
W
2
∈
R
d
r
×
1
W_2∈R^{\frac{d}{r}\times 1}
W2∈Rrd×1是可学习矩阵,
r
=
16
r=16
r=16是采样比。
δ
(
⋅
)
\delta(\cdot)
δ(⋅)分别是指ReLU的激活函数(在视觉中)和tanh的激活函数(在语言中)
2)查询关系模块(QRM)
QRM用于建立视觉和语言模式之间的联系。它能够引导视觉功能在语言模态中查询相关的键。设以
x
∈
R
d
1
x\in R_{d_1}
x∈Rd1为关键向量,
y
∈
R
d
2
y\in R_{d_2}
y∈Rd2为查询向量,则QRM的公式为:
QRM
(
x
,
y
)
=
y
⊙
(
W
q
⋅
x
)
(2)
\text{QRM}(x,y)=y\odot(W_q\cdot x) \tag{2}
QRM(x,y)=y⊙(Wq⋅x)(2)
其中
⊙
\odot
⊙表示点积,
W
q
∈
R
d
2
×
d
1
W_q\in R^{d_2\times d_1}
Wq∈Rd2×d1是一个可学习的矩阵。
3)掩模模板
我们假设 M = { m 1 , … , m n } \text{M}=\{m_1,\dots,m_n\} M={m1,…,mn}作为掩模模板,这将被我们的渐进掩模策略所采用。这里的 n n n与输入向量的数量和 m i ∈ { 0 , − ∞ } m_i\in \{0,-\infty \} mi∈{0,−∞}一致,其中在每个训练步骤中初始化时 m i m_i mi为0。我们将视觉模态和语言模态的掩模模板 M M M定义为 M V = { m 1 v , … , m n v } M^V=\{m^v_1,\dots,m^v_n\} MV={m1v,…,mnv}和 M T = { m 1 t , … , m n t } M^T=\{m^t_1,\dots,m^t_n\} MT={m1t,…,mnt}。它的元素将通过逐阶段的方式逐步更新,并将在下面的小节中详细阐述。
B.视觉模态中的渐进掩模注意
识别部分定位是视觉领域中细粒度识别的一种常用技术和核心技术。在本节中,我们设计了一种自注意力机制来定位从原始图像中最有区别的部分。更重要的是,我们将渐进掩模策略应用到注意模块中,逐步关注一组不同的非重叠部分,而现有的基于注意的多区分部分定位方法只重复关注几个重要部分。具体来说,对于每个被参加的阶段,我们使用一个掩模来丢弃上一阶段的定位部分。因此,我们的PMA可以在不同的阶段定位有区别但不同的部分。为了提高细粒度识别性能,我们还将由注意权重和判别部分特征计算出的全局图像语义聚合为单个阶段的最终状态。此外,本阶段区分部分的特征向量将用于语言形态中进行文本指导。
1)输入准备
给定一个图像,我们使用传统的CNN对其进行编码,并从最后一个卷积层(如VGG-16中的conv5_3)获得输出。让它是 X ∈ R h × w × d X\in R^{h\times w \times d} X∈Rh×w×d。对于细粒度识别,大的图像分辨率可以用于捕获有区别但细微的对象的部分,但也会由于深度描述符数量的增加而增加计算负担。我们在此使用一个额外的 2 × 2 2\times2 2×2最大池操作符来收集更紧凑的信息,这也可以减少最终描述符的数量,而不影响被大分辨率捕获的细微细节。同时,额外的池化可以改善这些集合描述符的接受域。因此,我们将 X X X看作是 2 × 2 2×2 2×2块的集合,其中 X = { x 1 , x 2 , … , x n } X=\{ x_1,x_2,\dots,x_n\} X={x1,x2,…,xn}和 n = h × w 4 n=\frac{h\times w}{4} n=4h×w。 x i ∈ R 2 × 2 × d x_i\in R^{2\times 2\times d} xi∈R2×2×d表示包含四个 d d d维深度描述符的第 i i i个 2 × 2 2\times2 2×2块。然后,我们在 X X X上附加一个 2 × 2 2\times 2 2×2最大池话,使每个特征映射包含更紧凑的信息。因此,输出表示为 X ~ = x 1 ~ , x 2 ~ , … , x n ~ \tilde{X}={\tilde{x_1},\tilde{x_2},\dots,\tilde{x_n}} X~=x1~,x2~,…,xn~,其中 x i ~ = f 2 × 2 − maxPool ( x i ) ∈ R 1 × 1 × d \tilde{x_i}=f_{2\times 2−\text{maxPool}}(x_i)\in R^{1\times 1\times d} xi~=f2×2−maxPool(xi)∈R1×1×d是聚合的局部特征向量。然后,使用 X ~ \tilde{X} X~作为我们的注意模块在视觉形态中的输入,同时收集全局信息和局部信息(即区分部分线索)。
2)视觉表达
给定一个图像,经过上述准备后,我们可以得到
X
~
=
x
1
~
,
x
2
~
,
…
,
x
n
~
\tilde{X}={\tilde{x_1},\tilde{x_2},\dots,\tilde{x_n}}
X~=x1~,x2~,…,xn~。然后,我们引入一个自注意,并使用以下视觉掩模模板
M
V
M^V
MV来评估每个局部特征向量
X
i
~
\tilde{X_i}
Xi~对应的注意权重
a
v
i
a^i_v
avi:
a
v
i
=
exp
(
SAM
(
x
i
~
)
+
m
i
v
)
∑
j
=
1
n
exp
(
SAM
(
x
j
~
)
+
m
j
v
)
(3)
a^i_v = \frac{\exp(\text{SAM}(\tilde{x_i})+m_i^v)} {\sum_{j=1}^n \exp(\text{SAM}(\tilde{x_j})+m_j^v)} \tag{3}
avi=∑j=1nexp(SAM(xj~)+mjv)exp(SAM(xi~)+miv)(3)
SAM
(
⋅
)
\text{SAM}(\cdot)
SAM(⋅)等于公式(1)以及
m
i
v
m_i^v
miv是
M
V
M^V
MV的第
i
i
i个元素。然后,我们计算每个局部特征向量的加权和作为内容向量
f
global
v
=
∑
i
=
1
n
a
i
v
x
i
~
f_{\text{global}}^v=\sum_{i=1}^n a_i^v\tilde{x_i}
fglobalv=∑i=1naivxi~接着
f
global
v
f_{\text{global}}^v
fglobalv可以看作是全局视觉流的表示,以反映图像级的全局视觉信息。
为了进一步提高细粒度识别精度,需要找到和定位具有鉴别信息的关键对象部分,以区分不同的子类别。由于注意权重 a i v a^v_i aiv可以反映相应部分对类别预测的重要性,因此我们可以根据这些注意权重的得分来定位关键部分。最大的 a i v a^v_i aiv应该是最重要的一个,它对应的 2 × 2 2\times 2 2×2块 x i x_i xi应该是我们想要定位的关键部分。我们把它表示为 x max x_{\text{max}} xmax。在此基础上,我们使用 1 × 1 -conv 1×1\text{-conv} 1×1-conv和 x max x_{\text{max}} xmax上的全局平均池化操作来获得一个紧凑的部位级特征。我们将该部分级特征表示为局部视觉流的 f local v f_{\text{local}}^v flocalv局部特征。请注意, f local v f_{\text{local}}^v flocalv收集了当前视觉特征中最具代表性的语义。此外,我们将使用 f v f_v fv本地来连接到语言模态的连接。
最后,我们将上述全局特征
f
global
v
f_{\text{global}}^v
fglobalv和局部特征
f
local
v
f_{\text{local}}^v
flocalv局部特征连接起来作为
f
vision
v
f_{\text{vision}}^v
fvisionv,形成视觉模态的最终表示:
f
vision
v
=
[
f
global
v
;
f
local
v
]
(4)
f_{\text{vision}}^v=[f_{\text{global}}^v;f_{\text{local}}^v] \tag{4}
fvisionv=[fglobalv;flocalv](4)
其中
[
⋅
;
⋅
]
[\cdot ;\cdot]
[⋅;⋅]表示连接操作。
3)渐进掩模策略:
基于公式(3),我们知道 a i v a^v_i aiv可以反映出 x i x_i xi区块应该注意的程度。为了实现多个不同部分的定位,我们设计了一种视觉掩模模板 M V M^V MV的掩模策略,迫使堆叠的模块以逐阶段的方式捕获不同的区分视觉部分。如果我们将当前阶段返回的最大注意权重表示为 a max v a^v_{\text{max}} amaxv。然后,在每个阶段结束时,我们将把掩码模板 m i v m^v_i miv的元素更新为 − ∞ −\infty −∞,如果 a i v = a max v a^v_i=a^v_{\text{max}} aiv=amaxv。在接下来的阶段,我们的注意力模块将根据更新的掩模 M V M^V MV定位另一个重要部分。受益于我们的渐进式掩模注意策略,我们捕获了多个判别部位,而没有部分部位。
语言模态中的渐进掩模注意
学习从视觉特征中对齐文本信息,是跨不同模式的联合表示学习中常用的一种方法。为了在任务中发挥语言模态的优势,我们采用基于查询的注意力来抓住每个定位部分相关的细粒度名词短语。这些被抓住的名词短语可以被认为是视觉领域的文本表示。然而,语言描述通常具有一些信息,而原始图像则无法表达。因此,我们也应用了一种自我注意机制和一种渐进式面具策略的自我注意机制,从语言模态中收集视觉领域外的知识。具体来说,我们在每个查询阶段后丢弃定位部分的一些相关名词短语,收集剩余的短语形成一个全局特征。基于查询的(本地)特性和全局特性都将在当前阶段被融合为最终状态。
1)输入准备
给定描述图像中细粒度对象特征的原始文本 T T T,我们首先采用一系列自然语言处理[34]中常用的技术(即单词标记化、词性标记和名词短语分块)从 T T T中进行提取每个名词短语,我们使用单词嵌入和长-短期记忆(LSTM)[35]来提取短语级嵌入。我们表示这些短语嵌入为 Z = { z 1 , z 2 , … , z p } Z=\{z_1,z_2,\dots,z_p\} Z={z1,z2,…,zp},其中 p p p是名词短语的数量, z i ∈ R d z_i\in R^d zi∈Rd是短语嵌入的向量。因此,采用 Z Z Z从语言形态中的注意模块中生成局部层次和全局层次的文本语义。
2)语言表示
针对定位的部分级特征
f
local
v
f_{\text{local}}^v
flocalv和转换后的短语嵌入
Z
Z
Z,设计了一种基于查询的文本掩码模板
M
T
M^T
MT的注意机制,以生成相应的文本表示。每个名词短语的注意权重
a
i
t
a_i^t
ait被计算为:
a
v
i
=
exp
(
QRM
(
f
local
v
,
z
i
)
+
m
i
t
)
∑
j
=
1
m
exp
(
QRM
(
f
local
v
,
z
i
)
+
m
i
t
)
a^i_v = \frac{\exp(\text{QRM}(f_{\text{local}}^v,z_i )+m_i^t)} {\sum_{j=1}^m \exp(\text{QRM}(f_{\text{local}}^v,z_i )+m_i^t)}
avi=∑j=1mexp(QRM(flocalv,zi)+mit)exp(QRM(flocalv,zi)+mit)
其中
QRM
(
⋅
,
⋅
)
\text{QRM}(\cdot,\cdot)
QRM(⋅,⋅)等于公式(2),并且
m
i
t
m_i^t
mit是
M
T
M^T
MT的第
i
i
i个元素。我们将内容向量形成为
f
local
t
=
∑
i
=
1
p
a
i
t
z
i
f_{\text{local}}^t=\sum_{i=1}^pa_i^t z_i
flocalt=∑i=1paitzi。更重要的是,
f
local
t
f_{\text{local}}^t
flocalt可以被认为是一个本地语言流,它为当前的视觉输出聚合了最典型的文本语义。
除了由定位部分特征引导的文本特征外,我们还想挖掘一些视觉领域之外的文本知识。因此,我们丢弃了与定位部分高度相关的短语,并在剩下的短语上采用自我注意机制来生成文本表示,从而收集了视觉域外的特征。每个短语的
a
~
i
t
\tilde{a}_i^t
a~it的注意力权重是:
a
v
i
=
exp
(
SAM
(
z
i
~
)
+
m
i
t
)
∑
j
=
1
m
exp
(
SAM
(
z
j
~
)
+
m
i
t
)
(6)
a^i_v = \frac{\exp(\text{SAM}(\tilde{z_i})+m_i^t)} {\sum_{j=1}^m \exp(\text{SAM}(\tilde{z_j})+m_i^t)} \tag{6}
avi=∑j=1mexp(SAM(zj~)+mit)exp(SAM(zi~)+mit)(6)
其中 SAM ( ⋅ , ⋅ ) \text{SAM}(\cdot,\cdot) SAM(⋅,⋅)等于公式(1),我们计算每个名词短语的加权和作为内容向量 f global t = ∑ i = 1 p a ~ i t z i f_{\text{global}}^t=\sum_{i=1}^p \tilde{a}_i^t z_i fglobalt=∑i=1pa~itzi。因此,将 f global t f_{\text{global}}^t fglobalt语言视为收集视觉域外的信息的全局语言流。
最后,我们将全局特征
f
global
t
f_{\text{global}}^t
fglobalt和局部特征
f
local
t
f_{\text{local}}^t
flocalt连接为
f
text
f_{\text{text}}
ftext,形成语言模态的最终表示:
f
text
=
[
f
global
t
;
f
local
t
]
f_{\text{text}}=[f_{\text{global}}^t;f_{\text{local}}^t]
ftext=[fglobalt;flocalt]
3)渐进掩模策略
渐进式掩模策略:基于公式(5), a i t a_i^t ait反映了短语 z i z_i zi与定位部分特征的相关性。由于我们希望捕获更多可能在图像中不存在的文本描述符,因此我们为文本掩码模板 M T M^T MT设计了一种掩码策略,以强制后续阶段探索更多的视觉域外特征。在本地流(语言模式)中进行基于查询的关注之后,我们将元素 m i t m^t_i mit更新为 − ∞ -\infty −∞,因为它的权重 a i t a^t_i ait排名前三,并且高于 1 / p 1/p 1/p。请注意,在当前阶段完成本地流后,将操作此掩码策略。受益于我们的渐进掩模策略,我们可以同时收集在视觉域和视觉域之外的文本表示
D.阶段性特征聚合
如前所述,我们分别设计了两个视觉和语言模式的渐进掩模注意模块,其中一个用于关键部分定位,另一个是获取文本的关键词。对于每个阶段,我们将视觉表示和文本表示连接为最终输出。之后,我们在每个阶段输出后添加一个共享的全连接层来进行降维:
f
final
i
=
FC
(
[
f
visual
i
;
f
text
i
]
(8)
f^i_{\text{final}}=\text{FC}([ f_{\text{visual}}^i;f^i_{\text{text}}] \tag{8}
ffinali=FC([fvisuali;ftexti](8)
其中,
[
⋅
;
⋅
]
[\cdot;\cdot]
[⋅;⋅]表示连接,
FC
(
⋅
)
\text{FC}(\cdot)
FC(⋅)表示完全连接的层。为了发挥多阶段集成的优势,我们还将这些输出状态汇总为预测的最终表示。在这里,我们在我们的方法中将阶段的数量限制为3。首先,我们通过对特征图X进行全局平均池化来提取对象级的表示对象,以获取图像级的视觉信息。然后,我们将对象级表示和多个阶段的输出连接起来,形成最终的表示
F
\bf{F}
F:
F
=
[
f
object
;
f
final
1
;
f
final
2
;
f
final
3
]
(9)
\bf{F}=[f_{\text{object}};f_{\text{final}}^1;f_{\text{final}}^2;f_{\text{final}}^3] \tag{9}
F=[fobject;ffinal1;ffinal2;ffinal3](9)
在这里,我们使用三个阶段作为一个示例。然后,在最终表示法
F
\bf{F}
F上附加一个带有softmax函数的全连接层,进行最终分类。利用传统的交叉熵损失来驱动整个网络的训练,我们的模型可以进行端到端进行训练。图2显示了我们的多阶段双模态渐进掩模注意模型的整个框架。
E. 双模态PMA的知识精馏技术
为了支持我们的双模态模型在单模态环境中进行预测(例如,仅使用图像数据),我们进一步执行了一个知识蒸馏方法[36],将视觉和语言模态的知识压缩到学生模型中。在这里,我们使用双模态PMA模型作为教师模型,以及一个标准网络(即,只采用原始图像作为输入)作为学生模型。
对于教师模型,我们将训练语料库定义为
(
s
i
,
y
i
)
∈
{
S
,
Y
}
(s_i,y_i)\in \{ S,Y \}
(si,yi)∈{S,Y},其中,
s
i
s_i
si表示一对图像和文本数据,而
y
i
y_i
yi表示标签。我们使用标准的交叉熵作为我们的模型的损失函数,如下:
L
t
e
a
c
h
e
r
=
(
Y
∣
S
;
θ
T
)
=
∑
i
=
1
N
∑
j
=
1
C
1
{
y
i
=
j
}
log
P
(
y
i
∣
s
i
;
θ
T
)
(10)
L_{teacher}=(Y|S;\theta_T )=\sum_{i=1}^N\sum_{j=1}^C 1\{ y_i=j\} \log{P(y_i|s_i;\theta_T) } \tag{10}
Lteacher=(Y∣S;θT)=i=1∑Nj=1∑C1{yi=j}logP(yi∣si;θT)(10)
其中,
N
N
N和
C
C
C为训练样本和类的数量,
θ
T
θ_T
θT为我们的教师模型(即双模态PMA模型)的参数。
对于学生模型,我们将训练语料库定义为
(
t
i
,
y
i
)
∈
{
T
,
Y
}
(t_i,y_i)\in \{T,Y\}
(ti,yi)∈{T,Y},其中
t
i
t_i
ti 为图像数据。我们的蒸馏器不是使用图像的标签,而强制学生模型学习教师模型的输出概率
P
(
y
i
∣
s
i
;
θ
T
)
P( y_i | s_i; \theta_T )
P(yi∣si;θT)进行预测。因此,知识蒸馏的损失函数可以用
L
t
e
a
c
h
e
r
=
(
Y
∣
T
;
θ
S
)
=
∑
i
=
1
N
∑
j
=
1
C
P
(
j
∣
s
i
;
θ
T
)
log
P
(
j
∣
t
i
;
θ
S
)
(11)
L_{teacher}=(Y|T;\theta_S )=\sum_{i=1}^N\sum_{j=1}^C P(j|s_i;\theta_T) \log{P(j|t_i;\theta_S) } \tag{11}
Lteacher=(Y∣T;θS)=i=1∑Nj=1∑CP(j∣si;θT)logP(j∣ti;θS)(11)
其中,
θ
S
θ_S
θS为学生模型的参数。基于公式(11),我们可以将两种模态的知识提取到视觉模态中,从而允许模型在推理过程中即使没有文本数据也能返回预测。
评价
搞定模态缺失问题的办法是模型蒸馏出一个子网络来进行推理,原网络不具有直接解决的能力
…
代码
这个论文特别坑 模型方面讲的不清不楚 用的数学公式不能让人明白具体做了什么操作 血压已经上来了,先写一部分,
import torch
from torch import nn
from torch.nn import functional as F
from torchvision import models
#SAM模块
class SAM(nn.Module):
def __init__(self,inputDim=512,ratio=16,activation="relu") -> None:
super(SAM,self).__init__()
self.linear1 = nn.Linear(inputDim,int(inputDim/ratio))
self.activation = nn.ReLU()
if activation=="relu":
self.activation = nn.ReLU()
else:
self.activation = nn.Tanh()
self.linear2 = nn.Linear(int(inputDim/ratio),1)
def forward(self,x):
x = self.linear1(x)
x = self.activation(x)
output = self.linear2(x)
return output
#qrm模块
class QRM(nn.Module):
def __init__(self,yDim=512,hiddenSize=200) -> None:
super(QRM,self).__init__()
self.linear = nn.Linear(hiddenSize,yDim)
def forward(self,x,y):
return self.linear(x)*(y)
目前试了很多超参数,准确率只能达到80%?!,如果实现的准确率还是那么低我就不误导大家放剩下的实现代码了。