SKnet:Selective Kernel Networks学习笔记+Pytorch代码实现

本文深入解析Selective Kernel Networks(SKNets),一种在CVPR 2019上发表的计算机视觉模型。文章详细介绍了SK注意力机制的工作原理及其与SE注意力机制的区别,并提供了构建SKNet的具体步骤。

论文题目:Selective Kernel Networks

发表于 CVPR 2019

论文地址:https://arxiv.org/pdf/1903.06586.pdf

在这里插入图片描述

作为一下对比,这里再附上SEnet的结构图:

在这里插入图片描述

总结:SK注意力机制和SE注意力机制的不同之处:
  • SE注意力只是在通道上施加MLP学习权重,来体现每个权重之间的重要性差异;
  • SE注意力机制只需要用到一个全局池化和两个全连接层;
  • SK注意力机制是SE注意力机制的升级版,特色之处体现在通过网络自己学习来选择融合不同感受野的特征图信息;
  • SK注意力机制涉及到空洞卷积,组卷积,全局平均池化还有全连接层,不过是通过卷积实现的;

SK注意力机制是如何实现的?

在这里插入图片描述
其实说白了,SK是可以选择融合不同感受野信息的卷积核。

使用SK注意力机制构建ResNet,也就只是将original Residual Block中的3*3的普通卷积核,替换成SK卷积核。

如上图,SK[M=2,G=32,r=16]表示的是什么意思呢?

首先,M表示的是使用不同感受野卷积核的数量,

G表示的是分组卷积的分组数,

r表示的是融合阶段的reduction系数

SK注意力机制的三部曲 Split、Fuse、Select
Split:

我们约定,输入特征图的维度是[batch_size, C, H, W]

首先Split是将输入的特征图X通过不同感受野的空洞卷积,上图中的M = 2,代表两组卷积操作,

一个kernel = 3 * 3,其实dilation = 1,得到特征图
在这里插入图片描述

这个特征图的维度仍然是[batch_size, C, H, W]

一个kernel = 5 * 5,得到特征图

其实真正的kernel_size = 3 * 3,

不过dilation = 2,所以实际的kernel = 5 * 5
在这里插入图片描述
这个特征图的维度也是[batch_size, C, H, W]

Fuse:

然后这两个特征图通过 element wise sum得到特征图U:

在这里插入图片描述
两个相同维度的特征图进行按元素相加,得到的特征图U的维度 也是[batch_size, C, H, W]

然后对U进行全局平均池化得到S:
在这里插入图片描述
得到的Sc的维度是[batch_size, C, 1, 1]

对于得到的Sc,其实就是SE注意力机制中的通道注意力了,

论文中定义了一个压缩通道的系数d:

在这里插入图片描述
其中 C是输入特征图的channel,r是超参数reduction,论文中提到的是r = 16;

L也是超参数,论文中设定的是L = 32;

对于经过全局平均池化的Sc,再进入一个全连接层得到压缩后的通道特征Z,起到降维的作用。

得到的Z的特征图的维度是[batch_size, d, 1, 1] 注意: C>d,所以起到降维的作用

然后再经过一个全连接层得到进行还原成M*C维的向量,起到升维的作用。

还原之后的特征图的大小的维度[batch_size, M*C, 1, 1]

其实这两个全连接层和SE注意力机制中起到的作用是一样的。

就是一个感知机,对通道注意力进行压缩然后再还原成输入向量的M倍,起到一个线性变换的作用。
为什么是M倍呢?

很简单,因为Split这一阶段进行了多组卷积的处理,这里需要对这多组卷积生成的特征图都进行空间注意力的提取。

在这之后,需要做的就是对于[batch_size, M*C, 1, 1]的特征图进行维度上的调整,使得其维度能对应成M个特征图,然后softmax之后进行select操作。

[batch_size, M*C, 1, 1]的特征图进行维度上的调整,变为 [batch_size, M, C, 1] 的大小,对应M个特征图

Select:

然后进行softmax,这是维度上没有任何变化。
在这里插入图片描述

接着将 [batch_size, M, C, 1] 的向量 变成 M 个[batch_size, 1, C, 1]的向量。

再进行reshape操作,变成M个[batch_size, C, 1, 1]的特征图,这样正好就是通道注意力特征图了。

接下来的操作就和SE模块一样了。将通道注意力与对应的特征图element wise相乘,然后M个特征图再element wise相加

在这里插入图片描述

就得到了最后的输出特征图了。

talk is easy, show your my code:

import torch.nn as nn
import torch
from functools import reduce
class SKConv(nn.Module):
    def __init__(self,in_channels,out_channels,stride=1,M=2,r=16,L=32)
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值