组卷积和深度可分离卷积

一、分组卷积(Group Convolution)

在这里插入图片描述
在这里插入图片描述
第一张图是标准的卷积操作,若输入的特征图是H×W×c1,卷积核的尺寸为h1×w1×c1,输出特征图的尺寸为H×W×c2,那么标准卷积层的参数量为h1×w1×c1×c2。

第二张图是分组卷积操作,将输入的调整图按通道数分为g组,则每组特征图的尺寸为H×W×(c1/g),对应的卷积核的尺寸为h1×w1×(c1/g),每组输出的特征图尺寸为H×W×(c2/g),将g组的结果拼接(concat),最终输出的特征图的尺寸为H×W×c2,此时分组卷积层的参数量是:
h1×w1×(c1/g)×(c2/g)×g=h1×w1×c1×c2×(1/g)

由此可看出分组卷积的参数量是标准卷积层的(1/g

二、深度可分离卷积(Depthwise separable convolution)

在这里插入图片描述
图a表示标准卷积,假设输入的特征图尺寸为Df×Df×M,卷积核尺寸为Dk×Dk×M,输出特征图的尺寸为Df×Df×N,标准卷积层的参数量为Dk×Dk×M×N。

图b表示深度卷积,图c表示分点卷积,两者合起来就是深度可分离卷积,深度卷积负责滤波,尺寸为Dk×Dk×1,共M个,作用在输入的每个通道上;逐点卷积负责转化通道,尺寸为1×1×M,共N个,作用在深度卷积的输出特征映射上。

深度卷积的参数量是Dk×Dk×1×M,逐点卷积的参数量是1×1×M×N,所以深度可分离卷积的参数量是标准卷积参数量比值是:
在这里插入图片描述

### 深度卷积与深度可分离卷积的工作原理 #### 深度卷积 (Depthwise Convolution) 深度卷积是一种特殊的卷积形式,在该过程中,输入数据被按通道独立处理。具体来说,对于每一个输入通道,都会单独应用一个卷积核进行运算,而不像传统卷积那样跨通道共享权重[^3]。这意味着如果输入有 \(C\) 个通道,则会有 \(C\) 个对应的卷积核分别作用于这些通道上。 #### 深度可分离卷积 (Depthwise Separable Convolution) 深度可分离卷积由两步组成:首先是上述提到的深度卷积;其次是逐点卷积(Pointwise Convolution),即通过\(1 \times 1\) 的标准卷积层将各个通道的信息重新融合起来[^1]。这种方法不仅保持了较高的表达能力,还极大地减少了参数数量以及计算量。 --- ### 深度卷积与深度可分离卷积的区别比较 | **特性** | **深度卷积** | **深度可分离卷积** | |-------------------------|--------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------| | **定义** | 对每个输入通道单独施加一个小尺寸滤波器 | 结合了深度卷积逐点卷积 | | **复杂度降低方式** | 减少了跨通道交互 | 进一步减少参数数目并通过简单线性变换恢复特征空间 | | **应用场景举例** | 常用于轻量化网络设计中作为基础组件 | 广泛应用于移动设备端高效神经网络架构如MobileNet系列 | 从理论上讲, 如果只采用depth-wise convolution而没有任何后续操作的话, 那么它实际上只是做了局部的空间上的feature map提取工作; 而separable convolutions则是在此基础上增加了channel之间的联系重建过程, 让最终得到的结果更加接近常规convolutions的效果但是消耗更少资源. 以下是利用tensorflow实现的一个简单的例子: ```python import tensorflow as tf input_tensor = tf.random.normal([1, 28, 28, 3]) # Depthwise Convolution Layer depthwise_conv_layer = tf.keras.layers.DepthwiseConv2D(kernel_size=3, padding='same') output_depthwise = depthwise_conv_layer(input_tensor) print("Output shape after Depthwise Conv:", output_depthwise.shape) # Pointwise Convolution Layer pointwise_conv_layer = tf.keras.layers.Conv2D(filters=64, kernel_size=1, padding='same', activation='relu') output_pointwise = pointwise_conv_layer(output_depthwise) print("Final Output Shape After Depthwise Separable Conv:", output_pointwise.shape) ``` 此代码片段展示了如何先执行一次`DepthwiseConv2D`, 接着再做一次普通的`Conv2D`(即所谓的Pointwise Convolution). --- ### 总结 虽然两者都旨在优化传统的二维卷积结构以适应特定需求场景下的效率考量, 不过相比之下, `Depthwise Separable Convolutions` 提供了一个更为全面解决方案——既保留了必要的信息传递路径又大幅削减冗余计算负担[^2].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值