19 lines
1.4 KiB
Python
19 lines
1.4 KiB
Python
|
||
"""
|
||
Selective Kernel Networks---CVPR2019
|
||
|
||
论文地址:https://arxiv.org/pdf/1903.06586.pdf
|
||
|
||
这是CVPR2019的一篇文章,致敬了SENet的思想。在传统的CNN中每一个卷积层都是用相同大小的卷积核,限制了模型的表达能力;而Inception这种“更宽”的模型结构也验证了,用多个不同的卷积核进行学习确实可以提升模型的表达能力。作者借鉴了SENet的思想,通过动态计算每个卷积核得到通道的权重,动态的将各个卷积核的结果进行融合。
|
||
|
||
个人认为,之所以所这篇文章也能够称之为lightweight,是因为对不同kernel的特征进行通道注意力的时候是参数共享的(i.e. 因为在做Attention之前,首先将特征进行了融合,所以不同卷积核的结果共享一个SE模块的参数)。
|
||
|
||
本文的方法分为三个部分:Split,Fuse,Select。Split就是一个multi-branch的操作,用不同的卷积核进行卷积得到不同的特征;Fuse部分就是用SE的结构获取通道注意力的矩阵(N个卷积核就可以得到N个注意力矩阵,这步操作对所有的特征参数共享),这样就可以得到不同kernel经过SE之后的特征;Select操作就是将这几个特征进行相加。
|
||
"""
|
||
from attention.SKAttention import SKAttention
|
||
import torch
|
||
|
||
input = torch.randn(50, 512, 7, 7)
|
||
se = SKAttention(channel=512, reduction=8)
|
||
output = se(input)
|
||
print(output.shape) |