我是靠谱客的博主 伶俐水壶,最近开发中收集的这篇文章主要介绍bilinear cnn中的计算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在看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中的计算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部