从理论到实践谈谈分组卷积(Group Convolution)与深度卷积(Depthwise Convolution)之间的联系

本文探讨了分组卷积和深度卷积在卷积神经网络中的应用。分组卷积通过通道划分实现多分支特征学习,而深度卷积是分组卷积的特殊情况,当groups等于输入通道数时出现。深度卷积常用于深度可分离卷积,以减少计算量。文章通过实例阐述了两种卷积的工作原理和计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、分组卷积

在各种卷积方式汇总的文章中详细描述了分组卷积相关内容及实现方式:https://blog.youkuaiyun.com/qq_43665602/article/details/126708012
此处粗略复习一下:在进行标准卷积时,通常采用多组过滤器得到期望的输出,而每个过滤器都使用与输入特征通道数相同的多个卷积核叠加构成。而对于分组卷积,我们通过对输入的通道进行划分实现多分支特征学习,最后将所有分支提取的特征进行级联得到最后的输出。比如,输入特征为(10,7,7),采用大小为(3,3)的卷积核,期望得到大小为(20,5,5)的输出:

1)对于标准卷积而言,在此过程中,一共采用20组过滤器进行特征提取,而每个过滤器是由10个(3,3)卷积核叠加而成,每个过滤器得到一个(5,5)的单通道输出,20组过滤器则得到最后的(20,5,5)输出。

### 深度可分离卷积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]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NorthSmile

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

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

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

打赏作者

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

抵扣说明:

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

余额充值