读 ncnn 源码(XXVI):`fuse_deconvolutiondepthwise_batchnorm`——深度反卷积的 BN 融合
读 ncnn 源码(XXVI):fuse_deconvolutiondepthwise_batchnorm——深度反卷积的 BN 融合
在 ncnn 的图优化系列 Pass 中,我们已经见证了针对标准卷积 (
Convolution)、深度卷积 (ConvolutionDepthWise) 和标准反卷积 (Deconvolution) 后续BatchNorm层的融合优化。为了构建一个完备的优化体系,ncnn 自然也覆盖了相对不那么常见、但同样可能存在的DeconvolutionDepthWise -> BatchNorm模式。本篇,我们将剖析
fuse_deconvolutiondepthwise_batchnorm的源码,理解其如何将 BN 融合的通用原理应用于深度反卷积 (DeconvolutionDepthWise) 这一特定层类型。
TL;DR
- 目标: 将
DeconvolutionDepthWise层后紧随的BatchNorm层进行融合,消除BatchNorm在推理时的计算开销。 - 模式匹配: 遍历网络
layers,查找DeconvolutionDepthWise -> BatchNorm的直接连接模式。 - 数学原理: 与所有其他卷积/反卷积 + BN 融合完全一致。
DeconvolutionDepthWise也是线性操作(逐通道独立),后接BatchNorm仍构成连续线性链。融合公式不变:- 令 BN 参数导出系数
b = slope / sqrt(var + eps)和a = bias - slope * mean / sqrt(var + eps)。 - 新权重 (逐通道相乘)。
- 新偏置 (逐通道计算)。
- 令 BN 参数导出系数
- 代码实现: 几乎与
fuse_convolutiondepthwise_batchnorm和fuse_deconvolution_batchnorm完全相同。- 计算中间系数
a和b。 - 遍历
DeconvolutionDepthWise的每个通道i。 - 将该通道对应的权重 (
weight_per_outch = kernel_w * kernel_h个元素) 乘以b[i]。 - 更新该通道的偏置
bias[i] = bias[i] * b[i] + a[i](如果原层无偏置,则先创建)。
- 计算中间系数
- 图结构修改: 将
DeconvolutionDepthWise的top指向原BatchNorm的top,更新blob的producer,并将BatchNorm标记为"ncnnfused"。 - 效果: 消除了
BatchNorm层的计算和内存访问,确保了即使在使用了深度反卷积的网络结构中,BN 融合优化也能生效。
1. 融合动机:统一处理线性合并
DeconvolutionDepthWise 与 ConvolutionDepthWise 类似,也是对每个通道独立应用一个反卷积核。其计算 依然是线性的。因此,其后接的 BatchNorm 层 同样可以被代数合并。
提供 fuse_deconvolutiondepthwise_batchnorm Pass 的主要目的是确保优化策略的完备性,使得无论开发者如何组合卷积、反卷积及其 Depthwise 变体与 BatchNorm,ncnnoptimize 工具都能有效地进行融合。
2. 代码实现:复用 BN 融合核心逻辑
fuse_deconvolutiondepthwise_batchnorm 的代码实现与其他卷积变体的 BN 融合 Pass 高度一致,仅层类型名称不同。
1 | int NetOptimize::fuse_deconvolutiondepthwise_batchnorm() |
关键点:
- 模式匹配: 查找
DeconvolutionDepthWise -> BatchNorm的直接连接。 - 参数计算: 计算
a,b系数的逻辑不变。 - 权重更新: 将
DeconvolutionDepthWise层每个通道ch对应的所有权重(kernel_w * kernel_h个)乘以该通道的b[ch]。 - 偏置更新: 将偏置
bias[ch]更新为bias[ch] * b[ch] + a[ch]。 - 图修改: 标准的重定向连接 + 标记融合操作。
3. 意义:优化策略的闭环
DeconvolutionDepthWise 本身可能不如标准卷积或深度卷积常用,但它仍然是构成某些特定网络结构(例如轻量级的上采样模块)的可能组件。提供 fuse_deconvolutiondepthwise_batchnorm Pass 体现了 ncnn 优化工具的设计哲学:力求覆盖所有理论上可行的、能够带来性能收益的线性算子融合模式。这确保了无论模型结构如何演变,只要存在 Conv/Deconv (及其 DW 变体) -> BN 的模式,都能被 ncnnoptimize 有效优化。
4. 结语
fuse_deconvolutiondepthwise_batchnorm 是 ncnn 针对卷积类算子与 BatchNorm 融合优化的最后一块拼图。它将成熟的融合逻辑应用于深度反卷积层,确保了优化策略的完整覆盖。通过这一系列(fuse_convolution_batchnorm, fuse_convolutiondepthwise_batchnorm, fuse_deconvolution_batchnorm, fuse_deconvolutiondepthwise_batchnorm)高度一致的 Pass,ncnn 系统性地消除了推理阶段各种形式卷积层后的冗余 BatchNorm 计算,为端侧模型的极致性能优化提供了有力支撑。
该封面图片由Andreas Neef在Pixabay上发布





