(即插即用模块-Convolution部分) 十六、(2024 CVPR) IDConv Inception深度卷积

在这里插入图片描述

paper:InceptionNeXt: When Inception Meets ConvNeX

Code:https://github.com/sail-sg/inceptionnext


1、Inception Depthwise Convolution

大核深度可分离卷积效率低下,尽管大核深度可分离卷积的 FLOPs 较低,但其内存访问成本高,在强大计算设备上(如 GPU)成为瓶颈。同时,小核卷积无法有效扩大感受野, 减小卷积核尺寸可以提高速度,但会限制模型的感受野,导致性能下降。这篇论文提出一种 Inception深度卷积(Inception Depthwise Convolution),通过保留部分通道不变,仅对部分通道进行处理来达到更好的效果。

IDConv 受 Inception 思想启发,将大核深度可分离卷积分解为多个并行分支,包括:小方核分支、正交带核分支以及恒等映射分支: 保持部分通道不变,避免信息丢失。

对于输入X,IDConv 的实现过程:

  1. 输入通道分割: 将输入通道沿通道维度分割为四组,分别对应四个分支。
  2. 恒等映射分支: 直接输出。
  3. 小方核分支: 使用 3x3 深度可分离卷积进行特征提取。
  4. 正交带核分支: 分别使用 1xk 和 kx1 深度可分离卷积进行特征提取。
  5. 特征融合: 将四个分支的输出进行拼接,得到最终的特征图。

优势:

  • 提高效率: Inception Depthwise Conv 避免了计算量大且效率低的大核深度可分离卷积,通过并行分支和部分通道处理,显著提高了模型效率。
  • 扩大感受野: 通过正交带核分支,模型能够有效扩大感受野,从而获得更好的性能。
  • 易于实现: Inception Depthwise Conv 结构简单,易于实现和部署。

Inception Depthwise Convolution 结构图:

在这里插入图片描述


2、代码实现

import math
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.nn.modules.utils import _triple


class InceptionDWConv2d(nn.Module):
    """ Inception depthweise convolution
    """

    def __init__(self, in_channels, square_kernel_size=3, band_kernel_size=11, branch_ratio=0.125):
        super().__init__()

        gc = int(in_channels * branch_ratio)  # channel numbers of a convolution branch
        self.dwconv_hw = nn.Conv2d(gc, gc, square_kernel_size, padding=square_kernel_size // 2, groups=gc)
        self.dwconv_w = nn.Conv2d(gc, gc, kernel_size=(1, band_kernel_size), padding=(0, band_kernel_size // 2),
                                  groups=gc)
        self.dwconv_h = nn.Conv2d(gc, gc, kernel_size=(band_kernel_size, 1), padding=(band_kernel_size // 2, 0),
                                  groups=gc)
        self.split_indexes = (in_channels - 3 * gc, gc, gc, gc)

    def forward(self, x):
        x_id, x_hw, x_w, x_h = torch.split(x, self.split_indexes, dim=1)
        return torch.cat(
            (x_id, self.dwconv_hw(x_hw), self.dwconv_w(x_w), self.dwconv_h(x_h)),
            dim=1,
        )


if __name__ == '__main__':
    x = torch.randn(2, 64, 128, 128)
    model = InceptionDWConv2d(64)
    output = model(x)
    print(output.shape)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御宇w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值