Advertisement

深度学习论文: Selective Kernel Networks及其PyTorch实现

阅读量:

Selective Kernel Networks是一种用于深度学习模型的关键组件。官方论文链接:通过访问https://arxiv.org/pdf/1903.06586.pdf可以获得原始研究论文。深度学习框架:PyTorch实现了Selective Kernel Networks的高效实现(代码仓库:https://github.com/implus/SKNet)。

1 概述

SENet是对图像特征中通道级别的注意力机制进行深入研究,在此基础之上,CBAM则聚焦于对空间域内的注意力机制展开探讨。相比之下,SKNet则将研究重点转移到了卷积核层面的注意力机制分析上。

SKNet开发出一种方法来处理卷积核的作用,在此过程中它能够生成不同重要性特征的卷积核以适应不同的输入图像。

基于自适应机制的不同输入通道分别配置了独立的可学习参数矩阵

2 Selective Kernel Convolution

在这里插入图片描述

网络主要包含Split、Fuse、Select三个核心模块。\n\nSplit: 网络对原特征图的不同尺寸的卷积核区域完成一次完整的分层特征提取过程。\n\n文中将该过程划分为两个不同的阶段:首先是使用3\times3大小的深度可分离Conv层实现初步特征提取;其次是针对5\times5尺寸情况,则建议采用双层3\times3空洞Conv结构以进一步增强模型表达能力。

Fuse: 负责处理每个卷积核权重的计算过程
a. 将各分支提取出的特征进行逐元素求和运算
b. 通过全局平均池化操作获取完整的全局特征表示
c. 整合为一个降维后的特征向量表示

Select: 根据不同权重卷积核计算后得到的新的特征图

PyTorch实现:

复制代码
    class SKConv(nn.Module):
    def __init__(self, features, WH, M, G, r, stride=1, L=32):
        super(SKConv, self).__init__()
        d = max(int(features / r), L)
        self.M = M
        self.features = features
        self.convs = nn.ModuleList([])
        for i in range(M):
            # 使用不同kernel size的卷积
            self.convs.append(
                nn.Sequential(
                    nn.Conv2d(features,
                              features,
                              kernel_size=3 + i * 2,
                              stride=stride,
                              padding=1 + i,
                              groups=G), nn.BatchNorm2d(features),
                    nn.ReLU(inplace=False)))
            
        self.fc = nn.Linear(features, d)
        self.fcs = nn.ModuleList([])
        for i in range(M):
            self.fcs.append(nn.Linear(d, features))
        self.softmax = nn.Softmax(dim=1)
    
    def forward(self, x):
        for i, conv in enumerate(self.convs):
            fea = conv(x).unsqueeze_(dim=1)
            if i == 0:
                feas = fea
            else:
                feas = torch.cat([feas, fea], dim=1)
        fea_U = torch.sum(feas, dim=1)
        fea_s = fea_U.mean(-1).mean(-1)
        fea_z = self.fc(fea_s)
        for i, fc in enumerate(self.fcs):
            print(i, fea_z.shape)
            vector = fc(fea_z).unsqueeze_(dim=1)
            print(i, vector.shape)
            if i == 0:
                attention_vectors = vector
            else:
                attention_vectors = torch.cat([attention_vectors, vector],
                                              dim=1)
        attention_vectors = self.softmax(attention_vectors)
        attention_vectors = attention_vectors.unsqueeze(-1).unsqueeze(-1)
        fea_v = (feas * attention_vectors).sum(dim=1)
        return fea_v	
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

3 Network Architecture

在这里插入图片描述

4 思维导图

在这里插入图片描述

Deep Learning

Deep Learning

Deep Learning

全部评论 (0)

还没有任何评论哟~