深度学习中组卷积(Group convolution)、深度卷积(Depthwise Convolution)以及深度可分离卷积(Depthwise Separable Convolution)的区别

在轻量化网络中,经常使用组卷积、深度卷积或是深度可分离卷积来降低FLOPs,那么三者的区别在哪里呢?下面总结一下。

一、标准卷积
下面是用一个卷积核对输入特征做一次卷积,得到的输出特征的通道为1。

在这里插入图片描述
二、组卷积
组卷积是将输入特征按通道分为g组,每组特征中的通道数为 C i n g \frac{C_{in}}{g} gCin,所以相应的卷积核的大小也变了,通道数变少了。每次卷积后的特征按通道concat输出特征。当分组数量和输出特征的通道相同时,即只有 C o u t C_{out} Cout个卷积核时,卷积分别对输入特征的每一组卷积1次;当输出特征的通道大于分组数量时,需要 C o u t C_{out} Cout个卷积核对输入特征的每一组卷积 C o u t / g C_{out}/g Cout/g次。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、深度卷积
深度卷积是组卷积的极端情况,将输入特征的每一通道分为一组,即分组数为 g = C i n g=C_{in} g=Cin。后续步骤和组卷积一致。
四、深度可分离卷积
深度可分离卷积是将深度卷积和点卷积( 1 × 1 1 \times 1 1×1卷积核)相结合。可以从深度卷积中可以得知,卷积核只是对通道的每一层进行了提取了特征,和标准卷积缺少了通道之间的信息交互。加入点卷积后可以增强特征通道之间的信息交互,进一步提升性能。具体可参考MobileNets v1

最后本文只是对三种卷积感性上的认识,具体的不同卷积的FLOPs计算请参考这篇文章

### 深度可分离卷积Depthwise Separable Convolution,DSC)的概念 深度可分离卷积是一种高效的卷积方法,它通过分解标准卷积操作来减少计算复杂性和参数数量。具体来说,深度可分离卷积可以分为两个阶段:逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。这种方法最早由 Google 提出并应用于 Xception 和 MobileNet 等模型中[^4]。 #### 逐通道卷积(Depthwise Convolution) 逐通道卷积是指对输入数据的每一个通道分别应用单独的小型卷积核进行处理。假设输入张量有 \( C \) 个通道,则每个通道都会独立地使用一个大小为 \( K \times K \) 的卷积核进行卷积操作。这种方式显著减少了所需的参数数量,因为不再需要跨通道共享权重[^3]。 #### 逐点卷积(Pointwise Convolution) 逐点卷积是一个普通的 \( 1 \times 1 \) 卷积操作,用于调整通道数或将不同通道的信息重新组合在一起。这一部分的主要作用是在保持低计算开销的同时增加网络表达能力。 --- ### 深度可分离卷积的实现方式 以下是深度可分离卷积的具体实现流程: 1. **逐通道卷积**:对于输入张量中的每个通道,执行一次小型卷积操作。 2. **逐点卷积**:利用 \( 1 \times 1 \) 卷积将上一步的结果融合成新的特征图。 这种设计使得深度可分离卷积相比传统卷积具有更低的计算成本和更少的参数,非常适合于资源受限环境下的轻量化神经网络架构。 --- ### PyTorch 中的代码示例 以下是一个简单的深度可分离卷积在 PyTorch 中的实现: ```python import torch import torch.nn as nn class DepthwiseSeparableConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, padding=1): super(DepthwiseSeparableConv, self).__init__() # 定义逐通道卷积 (Depthwise Convolution) self.depthwise_conv = nn.Conv2d( in_channels=in_channels, out_channels=in_channels, groups=in_channels, kernel_size=kernel_size, padding=padding, bias=False ) # 定义逐点卷积 (Pointwise Convolution) self.pointwise_conv = nn.Conv2d( in_channels=in_channels, out_channels=out_channels, kernel_size=1, bias=False ) def forward(self, x): # 执行逐通道卷积 x = self.depthwise_conv(x) # 执行逐点卷积 x = self.pointwise_conv(x) return x # 测试代码 if __name__ == "__main__": input_tensor = torch.randn(1, 3, 32, 32) # 输入形状 [batch_size, channels, height, width] model = DepthwiseSeparableConv(in_channels=3, out_channels=64) output = model(input_tensor) print(output.shape) # 输出形状应为 [1, 64, 32, 32] ``` 上述代码定义了一个 `DepthwiseSeparableConv` 类,其中包含了两步核心操作:逐通道卷积和逐点卷积。测试代码展示了如何创建一个随机输入张量并通过该模块得到输出[^1]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值