Bilinear CNN

Bilinear CNN

参考论文:

  • Tsung-Yu Lin, Aruni RoyChowdhury, and Subhransu Maji. Bilinear CNN
    models for fine-grained visual recognition. ICCV 2015: 1449-1457.
  • Tsung-Yu Lin, Aruni RoyChowdhury, and Subhransu Maji. Bilinear
    convolutional neural networks for fine-grained visual recognition.
    TPAMI 2018, 40(6): 1309-1322.

Bilinear CNN的关键在于那个bilinear pooling,即如何融合不同通道的信息来实现细粒度分类。传统的方法比如求和或者平均,只用了一阶统计信息。而bilinear pooling 用了二阶统计信息,意在当一阶信息相同的时候利用二阶信息的不同来做分类。

当然,传统的特征融合方法里面也包括feature concatenation。这个从代数上可以看做direct sum,而bilinear pooling可以看做direct product. 因此造成的特征纬度会很高,可以做细粒度分类的同时也容易过拟合。

双线性池化(bilinear pooling) 计算不同空间位置的外积,并对不同空间位置计算平均池化以得到双线性特征。外积捕获了特征通道之间成对的相关关系,并且这是平移不变的。双线性池化提供了比线性模型更强的特征表示,并可以端到端地进行优化。
在这里插入图片描述

实现方式:pytorch 
x = x.view(bs, 1280, 7 ** 2)
x = (torch.bmm(x, torch.transpose(x, 1, 2)) / 7 ** 2).view(bs, -1)
x = torch.nn.functional.normalize(torch.sign(x) * torch.sqrt(torch.abs(x) + 1e-10))

在这里插入图片描述

函数:

1. torch.bmm
对存储在两个批batch1和batch2内的矩阵进行批矩阵乘操作。torch.bmm(batch1, batch2, out=None)
用法:

>>> batch1 = torch.randn(10, 3, 4)
>>> batch2 = torch.randn(10, 4, 5)
>>> res = torch.bmm(batch1, batch2)
>>> res.size()torch.Size([10, 3, 5])

2. torch.transpose(input, dim0, dim1, out=None):
返回输入矩阵input的转置,交换维度dim0和dim1。输入张量与输出张量共享内存。

  • input(Tensor) - 输入张量
  • dim0(int) - 转置的第一维
  • dim1(int) - 转置的第二维
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peanut_范

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值