[Deeplearning]dwconv

本文详细介绍了深度卷积(DWConv)网络,它由深度可分离卷积(Depthwise Convolution)和点卷积(Pointwise Convolution)两部分组成。深度可分离卷积首先对每个通道单独进行卷积,然后通过点卷积将不同通道的特征融合,以减少计算参数量。Yolo系列模型中就应用了这种结构。

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

dwconv 

是由一个两部分卷积组成的一个网络

第一部分是depthwise conv 是分通道的一个卷积 就是每个卷积核对应input的每一个通道 有图好理解很多 如下

 图源https://blog.csdn.net/tintinetmilou/article/details/81607721

因为上面每个层的特征都分开 没有有效的利用相同空间位置上不同层的有效信息,所以有了第二部分

第二部分是pointwise conv

它将第一部分各自独立的featuremap进行组合生成了新的

它是一个kernelsize为1,通道数为input通道数的一个卷积,具体如图

这里写图片描述

  图源https://blog.csdn.net/tintinetmilou/article/details/81607721

这个dwconv主要是为了降低卷积运算参数量。

但具体参数量计算请看 https://yinguobing.com/separable-convolution/#fn2

yolo系列里的代码如下

class DWConv(nn.Module):
    """Depthwise Conv + Conv"""
    def __init__(self, in_channels, out_channels, ksize, stride=1, act="silu"):
        super().__init__()
        self.dconv = BaseConv(
            in_channels, in_channels, ksize=ksize,
            stride=stride, groups=in_channels, act=act
        )
        self.pconv = BaseConv(
            in_channels, out_channels, ksize=1,
            stride=1, groups=1, act=act
        )

    def forward(self, x):
        x = self.dconv(x)
        return self.pconv(x)

03-08
### 关于深度可分离卷积(Depthwise Convolution) 在神经网络中,尤其是卷积神经网络(CNN),深度可分离卷积是一种优化标准卷积操作的方法[^3]。这种方法通过减少参数数量和计算量来提高效率。 #### 深度可分离卷积的工作原理 深度可分离卷积可以分为两步执行: 1. **逐通道卷积(Depthwise Convolution)** 对输入数据的每一个通道单独应用一个小滤波器,而不混合不同通道之间的信息。假设有一个形状为 \(H \times W \times C\) 的输入张量,则会使用 \(C\) 个大小为 \(k \times k\) 的独立核分别作用于每个特征图上,得到同样维度的新特征映射\(H' \times W' \times C'\)[^4]。 2. **逐点卷积(Pointwise Convolution)** 使用 \(1 \times 1\) 大小的卷积核对由第一步产生的输出做线性组合,从而调整输出的空间尺寸并控制最终输出的通道数。这一步骤允许跨通道的信息交流,并能改变输出特征的数量。 这种设计使得模型可以在保持性能的同时显著降低复杂度,尤其适用于移动设备或其他资源受限环境中部署高效CNN架构的应用场景。 ```python import tensorflow as tf def depthwise_conv(input_tensor, kernel_size=(3, 3), strides=(1, 1)): """ 实现一个简单的深度可分离卷积层 参数: input_tensor: 输入张量 kernel_size: 卷积核大小,默认(3, 3) strides: 步幅,默认(1, 1) 返回: 经过深度可分离卷积处理后的张量 """ # 执行 Depthwise Convolution dw_output = tf.keras.layers.DepthwiseConv2D( kernel_size=kernel_size, strides=strides, padding='same')(input_tensor) # 添加 Batch Normalization 和 ReLU 激活函数 bn_dw_output = tf.keras.layers.BatchNormalization()(dw_output) act_bn_dw_output = tf.keras.layers.ReLU()(bn_dw_output) return act_bn_dw_output # 创建测试用的随机输入张量 test_input = tf.random.normal([1, 28, 28, 3]) # 调用定义好的函数进行预测 output = depthwise_conv(test_input) print(output.shape) # 输出应保留原始高度宽度不变而仅改变了channel数目 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值