概述
在看bilinear cnn论文时,文章中描述经过两个网络分别得到的两个特征图,假设形状均为3×5×5,对两个特征图相同位置的3×1的特征向量作外积,得到3×3的矩阵,而特征图有5×5=25个位置,因此有25个这样的3×3矩阵,之后采用sum_pooling,也就是25个矩阵对应位置相加,最终得到的矩阵打为一维,后经过有符号的开根号、L2 normalization进行SVM判断。具体计算如下所示:
此计算的效果等同于将两个3×5×5的特征图转为3×25的特征图,之后两个3×25的特征图作外积,得到的效果与上面的效果相同。
代码如下:
import torch
if __name__=="__main__":
x = torch.randn((3, 5, 5))
cor_sum = 0
for i in range(5):
for j in range(5):
vec = torch.unsqueeze(x[:, i, j], dim=1)
cor = vec @ vec.transpose(1, 0)
cor_sum = cor_sum + cor
print(cor_sum)
x = x.reshape(3, -1)
Cor_sum = x @ x.transpose(1, 0)
print(Cor_sum)
tensor([[29.2531, 0.0474, -4.7499],
[ 0.0474, 20.0788, -3.6187],
[-4.7499, -3.6187, 17.9660]])
tensor([[29.2531, 0.0474, -4.7499],
[ 0.0474, 20.0788, -3.6187],
[-4.7499, -3.6187, 17.9660]])
按照这样的计算可知,其获得的是不同通道之间的相互关系,也就是协方差矩阵。
最后
以上就是伶俐水壶为你收集整理的bilinear cnn中的计算的全部内容,希望文章能够帮你解决bilinear cnn中的计算所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复