Depth-wise Convolution keras 运行时间缓慢原因

本文对比了标准卷积与深度可分离卷积(depth-wise conv2D)在参数量与计算复杂度上的显著差异,深度剖析了深度可分离卷积如何减少参数量及计算量,同时也讨论了其在实际应用中可能遇到的性能瓶颈,尤其是在IO读取次数上的增加导致的运行速度降低。

提到depth-wise conv2D 大家都如数家珍,这里我就简单的介绍一下,用两张图就可以概述出来了,大家想要看具体的介绍可以看

A Basic Introduction to Separable Convolutions 这篇文章介绍的很清楚。

上图是一个正常的卷积操作,是一个12×12×3的特征图经过256个卷积核大小为5×5×3的卷积得到了一个8×8×256的特征图。这是正常的卷积。参数量为256 x 5 x 5 x 3 = 19200,乘法次数为256 x 5 x 5 x 3 x 8 x 8 = 1228800。

上图就是一个depthwisie-conv2D 卷积了。可以看到它采用了3个5×5×1的卷积核来操作得到3个8×8 ×3的特征图。其参数量

3 x 5 x 5 x 1 乘法次数为3 x 5 x 5 x 1 x 8 x 8。我们可以看到参数量核乘法次数大大降低了。下面是一个 Point-wise Conv.的操作。这两个加起来就是一个Separable Conv 了。

### Depth-wise Convolution in Neural Networks Depth-wise convolution 是一种用于神经网络中的高效卷积操作方法,其主要目的是减少计算量并降低模型复杂度。相比于传统的标准卷积(standard convolution),depth-wise convolution 对每个输入通道分别应用单独的卷积核,而不像传统卷积那样跨多个通道共享同一个卷积核。 #### 定义与工作原理 在 depth-wise convolution 中,假设输入张量具有 \( n \) 个通道,则会为这 \( n \) 个通道中的每一个分配一个独立的卷积核[^3]。这些卷积核仅作用于对应的单个通道上,因此不会发生跨通道的信息混合。最终输出的通道数量等于输入通道的数量 \( n \),并且如果 stride 设置为 1 并采用 same padding 的话,输出的空间尺寸保持不变[^4]。 这种设计显著减少了参数数目和计算开销,因为不再需要维护大量的跨通道权重矩阵。例如,在常规卷积中,对于大小为 \( k \times k \) 的滤波器和 \( c_{in} \) 输入通道、\( c_{out} \) 输出通道的情况,所需的总参数数量为: \[ k \cdot k \cdot c_{in} \cdot c_{out} \] 而在 depth-wise 卷积中,由于每层只处理单一通道的数据流,总的参数数量降为了: \[ k \cdot k \cdot c_{in} \] 其中 \( c_{in} = c_{out} \)。 #### 应用场景 Depth-wise convolution 常与其他技术结合使用来构建更高效的架构。例如,在 MobileNet 和 Xception 这样的轻量化 CNN 设计中,它被用来替代普通的二维空间卷积操作。通过先执行一次 depth-wise convolution 来提取局部特征图谱上的信息,再利用 pointwise convolutions (即 \(1\times1\) 卷积)实现线性组合功能从而恢复必要的表达能力。 此外,一些先进的图像分类框架也采用了类似的策略——channel-wise convolutions 方法进一步优化资源利用率的同时维持较高的预测精度水平[^1]。 ```python import tensorflow as tf def depthwise_conv(input_tensor, kernel_size=3, strides=(1, 1), padding='same'): """ Perform a depthwise convolution on the input tensor. Args: input_tensor (tf.Tensor): Input tensor with shape [batch, height, width, channels]. kernel_size (int or tuple(int)): Size of the convolution window. strides (tuple(int,int)): Stride length along each spatial dimension. padding (str): Type of padding algorithm to use ('valid', 'same'). Returns: A TensorFlow Tensor after applying depthwise convolution. """ output = tf.keras.layers.DepthwiseConv2D( kernel_size=kernel_size, strides=strides, padding=padding)(input_tensor) return output ``` 上述代码片段展示了如何基于TensorFlow库定义一个简单的深度可分离卷积函数 `depthwise_conv` ,该函数接受任意形状的标准四维张量作为输入,并返回经过相应变换后的结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值