概述
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) - 转置的第二维
最后
以上就是冷静鱼为你收集整理的Bilinear CNN的全部内容,希望文章能够帮你解决Bilinear CNN所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复