【SKConv】即插即用!来自CVPR 2019的选择性内核网络帮你论文涨点

简介: 【SKConv】即插即用!来自CVPR 2019的选择性内核网络帮你论文涨点

前言

  在卷积操作中,每个卷积核都是固定大小的,无法适应输入数据中的不同空间结构。为了解决这个问题,一种新型的卷积操作——SKCONV应运而生。SKCONV引入了动态卷积核形状的概念,能够自适应地学习卷积核的形状和大小,从而能够更好地适应输入数据的空间结构,提高模型的性能。本文将介绍SKCONV的原理、实现方式以及在不同任务中的应用效果,希望能够帮助读者更好地了解这一创新性的卷积操作。

原理

  SKCONV是一种动态卷积操作,它能够根据输入数据的不同空间结构自适应地学习卷积核的形状和大小。SKCONV的原理是基于Split-and-Combine(拆分与合并)思想和Channel-wise交互(通道间交互)机制。SKCONV的拆分与合并思想指的是将输入特征图按通道数进行拆分,然后对每个通道进行卷积操作,最后再将不同通道的结果合并。SKCONV通过不同通道间的交互,自适应地学习卷积核的形状和大小,从而适应输入数据中的不同空间结构。

image.png

交互机制

  SKCONV中的Channel-wise交互机制主要包括两个部分:组稀疏交互和通道注意力机制。组稀疏交互指的是将输入特征图按组进行拆分,并只允许不同组之间的交互,这样可以减少模型的计算量。通道注意力机制则是对不同通道的特征进行加权,让网络自动学习每个通道的重要性,从而提高特征图的表达能力。

精要概括

  SKCONV的精髓部分是动态卷积核形状、Split-and-Combine思想、组稀疏交互和通道注意力机制。SKCONV的精髓部分主要包括以下几个方面:

  1. 动态卷积核形状:SKCONV能够根据输入数据的不同空间结构自适应地学习卷积核的形状和大小,从而能够更好地适应输入数据的空间结构,提高模型的性能。
  2. Split-and-Combine思想:SKCONV采用Split-and-Combine思想,将输入特征图按通道数进行拆分,然后对每个通道进行卷积操作,最后再将不同通道的结果合并。这种拆分与合并的方法能够在减少计算量的同时,提高特征图的表达能力。
  3. 组稀疏交互:SKCONV采用组稀疏交互机制,只允许不同组之间的交互,从而减少了模型的计算量。这种交互方式还能够帮助模型更好地捕捉不同通道之间的相关性。
  4. 通道注意力机制:SKCONV采用通道注意力机制,自动学习每个通道的重要性,从而提高特征图的表达能力。这种机制能够让模型更加关注重要的特征,抑制无用的特征,从而提高模型的性能。

  综上所述,SKCONV能够自适应地学习卷积核的形状和大小,从而能够更好地适应输入数据的空间结构,提高模型的性能。同时,SKCONV还采用了组稀疏交互和通道注意力机制,进一步提高了模型的表达能力。

实现

  SKCONV的实现方式主要包括Split、Group Convolution、Combine和Group Shuffle等步骤,其中Group Convolution是SKCONV的核心实现方式,它通过自适应学习卷积核的形状和大小,并采用组稀疏交互机制,从而提高特征图的表达能力,减少计算量,提高模型性能。

SKCONV的实现方式可以分为以下几个步骤:

  1. Split操作:首先将输入的特征图按通道数进行拆分,得到多个子特征图,每个子特征图只包含一个通道。
  2. Group Convolution操作:对每个子特征图进行卷积操作,使用多个不同形状和大小的卷积核进行卷积,得到多个卷积结果。
  3. Combine操作:将不同通道的卷积结果进行组合,得到最终的输出特征图。在组合过程中,可以采用通道注意力机制,自适应地学习每个通道的权重,从而提高特征图的表达能力。
  4. Group Shuffle操作:将组内的通道进行随机重排,从而增加模型的随机性和泛化能力。

python

复制代码

import torch
from torch import nn
class SKConv(nn.Module):
    def __init__(self, features, WH, M, G, r, stride=1, L=32):
        """ Constructor
        Args:
            features: input channel dimensionality.
            WH: input spatial dimensionality, used for GAP kernel size.
            M: the number of branchs.
            G: num of convolution groups.
            r: the radio for compute d, the length of z.
            stride: stride, default 1.
            L: the minimum dim of the vector z in paper, default 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):
            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.gap = nn.AvgPool2d(int(WH/stride))
        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 = self.gap(fea_U).squeeze_()
        fea_s = fea_U.mean(-1).mean(-1)
        fea_z = self.fc(fea_s)
        for i, fc in enumerate(self.fcs):
            vector = fc(fea_z).unsqueeze_(dim=1)
            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
class SKUnit(nn.Module):
    def __init__(self, in_features, out_features, WH, M, G, r, mid_features=None, stride=1, L=32):
        """ Constructor
        Args:
            in_features: input channel dimensionality.
            out_features: output channel dimensionality.
            WH: input spatial dimensionality, used for GAP kernel size.
            M: the number of branchs.
            G: num of convolution groups.
            r: the radio for compute d, the length of z.
            mid_features: the channle dim of the middle conv with stride not 1, default out_features/2.
            stride: stride.
            L: the minimum dim of the vector z in paper.
        """
        super(SKUnit, self).__init__()
        if mid_features is None:
            mid_features = int(out_features / 2)
        self.feas = nn.Sequential(
            nn.Conv2d(in_features, mid_features, 1, stride=1),
            nn.BatchNorm2d(mid_features),
            SKConv(mid_features, WH, M, G, r, stride=stride, L=L),
            nn.BatchNorm2d(mid_features),
            nn.Conv2d(mid_features, out_features, 1, stride=1),
            nn.BatchNorm2d(out_features)
        )
        if in_features == out_features:  # when dim not change, in could be added diectly to out
            self.shortcut = nn.Sequential()
        else:  # when dim not change, in should also change dim to be added to out
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_features, out_features, 1, stride=stride),
                nn.BatchNorm2d(out_features)
            )
    def forward(self, x):
        fea = self.feas(x)
        return fea + self.shortcut(x)

实验结果

  下表是论文中提到的实验结果对比图,其中224×表示用于评估的单个224×224作物,同样是320×。需要注意的是,senet / sknet都是基于相应的ResNeXt主干

image.png

总结

  针对上述的SKConv结构,大家可以自行嵌入到分类网络中以及检测任务、分割任务等。希望本篇文章对大家有所帮助!


相关文章
|
4月前
|
机器学习/深度学习 计算机视觉 知识图谱
【YOLOv8改进】MobileViT 更换主干网络: 轻量级、通用且适合移动设备的视觉变压器 (论文笔记+引入代码)
MobileViT是针对移动设备的轻量级视觉Transformer网络,结合CNN的局部特征、Transformer的全局注意力和ViT的表示学习。在ImageNet-1k上,它以600万参数实现78.4%的top-1准确率,超越MobileNetv3和DeiT。MobileViT不仅适用于图像分类,还在目标检测等任务中表现出色,且优化简单,代码已开源。YOLOv8引入了MobileViT块,整合卷积和Transformer结构,提升模型性能。更多详情可参考相关专栏和链接。
|
2天前
|
机器学习/深度学习 网络安全 TensorFlow
探索操作系统的心脏:内核与用户空间的奥秘云计算与网络安全:技术挑战与未来趋势深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【8月更文挑战第29天】在数字世界的每一次点击与滑动背后,都隐藏着一个不为人知的故事。这个故事关于操作系统——计算机的灵魂,它如何协调硬件与软件,管理资源,并确保一切运行得井井有条。本文将带你走进操作系统的核心,揭示内核与用户空间的秘密,展现它们如何共同编织出我们日常数字生活的底层结构。通过深入浅出的讲解和代码示例,我们将一同解锁操作系统的神秘面纱,理解其对现代计算的重要性。 【8月更文挑战第29天】本文将深入探讨卷积神经网络(CNN)的基本原理和结构,以及它们如何被广泛应用于图像识别任务中。我们将通过代码示例来展示如何使用Python和TensorFlow库构建一个简单的CNN模型,并训练
|
28天前
|
机器学习/深度学习 算法 网络架构
神经网络架构殊途同归?ICML 2024论文:模型不同,但学习内容相同
【8月更文挑战第3天】《神经语言模型的缩放定律》由OpenAI研究人员完成并在ICML 2024发表。研究揭示了模型性能与大小、数据集及计算资源间的幂律关系,表明增大任一资源均可预测地提升性能。此外,论文指出模型宽度与深度对性能影响较小,较大模型在更多数据上训练能更好泛化,且能高效利用计算资源。研究提供了训练策略建议,对于神经语言模型优化意义重大,但也存在局限性,需进一步探索。论文链接:[https://arxiv.org/abs/2001.08361]。
22 1
|
2月前
|
Linux 开发工具
CPU-IO-网络-内核参数的调优
CPU-IO-网络-内核参数的调优
57 7
|
2月前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
111 1
|
2月前
|
机器学习/深度学习 大数据 计算机视觉
【YOLOv8改进 - 特征融合】 GELAN:YOLOV9 通用高效层聚合网络,高效且涨点
YOLOv8专栏探讨了深度学习中信息瓶颈问题,提出可编程梯度信息(PGI)和广义高效层聚合网络(GELAN),改善轻量级模型的信息利用率。GELAN在MS COCO数据集上表现优越,且PGI适用于不同规模的模型,甚至能超越预训练SOTA。[论文](https://arxiv.org/pdf/2402.13616)和[代码](https://github.com/WongKinYiu/yolov9)已开源。核心组件RepNCSPELAN4整合了RepNCSP块和卷积。更多详情及配置参见相关链接。
|
24天前
|
人工智能 算法 安全
【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 赛后总结之31页论文及代码
本文总结了2023年第十三届MathorCup高校数学建模挑战赛C题的解题过程,详细阐述了电商物流网络在面临突发事件时的包裹应急调运与结构优化问题,提出了基于时间序列预测、多目标优化、遗传算法和重要性评价模型的综合解决方案,并提供了相应的31页论文和代码实现。
31 0
|
2月前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
|
2月前
|
机器学习/深度学习 编解码 人工智能
一种基于YOLOv8改进的高精度表面缺陷检测网络, NEU-DET和GC10-DET涨点明显(原创自研)
【7月更文挑战第3天】一种基于YOLOv8改进的高精度表面缺陷检测, 在NEU-DET和GC10-DET任务中涨点明显;
74 1
|
3月前
|
Web App开发 自然语言处理 算法
一文搞懂:【论文笔记】BINE:二分网络嵌入
一文搞懂:【论文笔记】BINE:二分网络嵌入
22 0
下一篇
云函数