摘要
作者没有对比现有方法的不足,而是直接提出少样本分类可以通过原学习“观察什么”和“注意哪里”的问题提高性能。文章提出里一个自关联模块SCR和一个交叉关联模块CCA,让模型先自我修正,再参照另一幅图像调整注意力范围,并最终优化少样本分类结果。
方法
架构
架构部分没啥好说的,基本看图就行,SC是自关联信息提取模块,g为四个卷积处理自关联信息,两者一起构成SCR。CC是交叉联信息提取模块,h为两个卷积处理交叉关联信息,两者一起构成CCA,最终输出两张图象分类结果。
不过以要注意的是,输入模型的两张图,一张是已知的支持图像support,一张是需要分类的查询图像query。
SCR
在SCR中,模型计算每个像素与周围像素的哈达玛积,即同尺寸矩阵按位相乘。像素点X处的矩阵为该位置每个通道的数值组成的一维矩阵。之后,确定超参数dU和dV,选取周围的像素相对于X的位移量必须在[-dU,dU]X[-dV,dV]之间。比如令dU=1,X的横坐标为5,那么周边像素可选横坐标范围为[4,6],包括X本身。
因为X处提取出的矩阵大小为1*C,哈达玛积之后依然为1*C。而确定dU和dV后,便可确定X周边可选像素个数为U*V,其中U=2dU+1,V=2dV+1。将这U*V个1*C矩阵合为一体,就是像素点X的周边信息,而一共有H*W个像素点,边缘处的点利用零填充保证其同样可以得到U*V个矩阵,则经过处理后,整个张量尺寸变为H*W*U*V*C。
上面所说的,还只是图中红色模块,真正提取出自关联信息的,主要是下面四个卷积。第一个卷积负责减少通道数,降低计算量,后面两个在U*V维度上进行的3*3卷积将U*V个矩阵的信息综合到一点,并最终通过1*1卷积恢复通道数。最后还有一个残差连接。
CCA
与SCR相似,CCA也是先提取信息,再处理,两者是分开的。第一步通过1*1卷积减少通道数。加下来的计算十分暴力,因为两张图象均为H*W大小,每个像素处有一个1*C'大小的矩阵。模型计算了两张图全部位置的点的相似度,因此计算后的张量大小达到了H*W*H*W*1。
还看不懂的话,就理解为ai与bj计算余弦相似度,a与b均为一维向量,i与j范围均为[1,H*W],每个a分别于每个b做运算,最后得到了H*W*H*W个结果,将这些结果放入四维矩阵,就得到了交叉关联信息。
最后之所以乘1而不是C',是因为SCR计算的是矩阵哈达玛积,结果依然为同规模矩阵,而CCA计算的是余弦相似度,是一个标量。
此时,模型记录的只是任意两点之间的余弦相似度,而查询图像的点与支持图像中哪个像素关系最密切还没算出。此时要通过如下公式计算Aq。
xq为查询图像上一个像素点,xs为支持图像上的像素点。
注意力池化
得到的Aq并不是最终嵌入,想要得到最终嵌入,还需要将Aq与F按H*W的维度相乘,得到一个1*C的嵌入。按H*W是指,对于F来说,任意一个像素点上有C个通道,即C个值,这些值分别与Aq对应位置的值相乘,得到结果。再将同一通道上的H*W个点的数值加到一起,最终得到了C*1的嵌入q。
损失函数
得到q还不够,还要经过一个全连接层得到分类结果。因此第一个损失是分类结果的损失。
w和b分别为分类器的权重和偏移,w为c*1,b为标量。w和c均有|Ctrain|个,即数量为训练集类别数。
在log内,分子一定会出现在分母那一堆数相加之中,所以分子越大,分母中其他数占比越小,整个数越大,但只能趋近于1,到不了1。经过log运算后的值也越从无穷小趋近于0,乘以-1后,就是分子越大,损失函数就从无穷大往0移动。
同时,作者还希望同一个类的嵌入尽可能接近,因此提出了另一个损失函数。假设查询集和支持集各k张图,来自c个类,则计算出两个集中每个类的嵌入的平均值和,则损失函数为
最终的损失函数为
k为超参数
消融实验
实验部分懒得讲了,基本就是吹自己,而且确实达到了SOTA,因此直接讲消融实验。
1.SCR和CCA的有无
简洁明了,看图就行
2.SCR模块的设计的影响
这一块看得有点懵,大意是说在SCR中,把求出H*W*U*V*C的张量那一步,替换为求出H*W*U*V*C/G的张量,即把多个通道的数据打包成一组,每组大小为G。当G为1时即为本文方法。由图可知,不把不同通道的结果挤在一起效果最好。就是那个x没看懂啥意思。
3.CCA模块的设计的影响
这个实验中讨论了CCA的有无和h中通道变化对性能的影响。虽然本文方法在CUB上表现更好,但连续两次通道数下降的方法却在mini-ImgNet上表现最佳。