模型部署——融合BN和Conv层

article/2025/10/6 17:42:23

今天我们将尝试了解如何使我们的模型在推理上更快一点。

使用 Batch Normalization 作为提高泛化能力的一种方式浪费了大量的网络。 但是在推理过程中,批量归一化被关闭,而是使用近似的每个通道均值和方差。 很酷的是,我们可以通过 1x1 卷积实现相同的行为。 更好的是将Batch Normalization 与前面的卷积合并。

Batch Normalization

假设 x x x 是要归一化的激活信号。 给定一组来自一个batch中不同样本的此类信号 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,归一化如下:

x ^ i = γ x i − μ σ 2 + ϵ + β = γ x i σ 2 + ϵ + β − γ μ σ 2 + ϵ \hat x_i = \gamma \frac{x_i-\mu}{\sqrt{\sigma^2+\epsilon} }+\beta= \frac{\gamma x_i}{\sqrt{\sigma^2+\epsilon}} +\beta- \frac{\gamma \mu}{\sqrt{\sigma^2+\epsilon}} x^i=γσ2+ϵ xiμ+β=σ2+ϵ γxi+βσ2+ϵ γμ

这里 μ \mu μ σ 2 \sigma^2 σ2 为这个batch上计算得到的均值和方差(在B,H,W维度上计算,每个channel单独计算),而 ϵ \epsilon ϵ 是防止除零所设置的一个极小值, γ \gamma γ 是比例参数,而 β \beta β 是平移系数。在训练过程中, μ \mu μ σ \sigma σ 在当前batch上计算:

μ = 1 n ∑ x i σ 2 = 1 n ∑ ( x i − μ ) 2 \mu = \frac{1}{n} \sum x_i \\ \sigma^2=\frac{1}{n}\sum(x_i-\mu)^2 μ=n1xiσ2=n1(xiμ)2

参数 γ \gamma γ β \beta β 与网络的其他参数一起通过梯度下降缓慢学习。 在测试期间,通常不会在一个batch图像上运行网络。 因此,不能使用前面提到的 μ \mu μ σ \sigma σ 公式。 相反,我们使用他们在训练期间通过exponential moving average计算的估计值 μ ^ \hat \mu μ^ σ ^ 2 \hat \sigma^2 σ^2

如今,批量归一化主要用于卷积神经网络中。 在此设置中,输入特征图的每个通道 c c c 都有均值 μ c \mu_c μc 和方差估计 σ c 2 \sigma_c^2 σc2 、平移 β c \beta_c βc 和比例参数 γ c \gamma_c γc

融合方案

对于一个形状为 C × H × W C \times H \times W C×H×W的特征图 F F F,记归一化结果 F ^ \hat F F^,计算如下:

在这里插入图片描述

上式为 f ( x ) = W x + b f(x)=Wx+b f(x)=Wx+b的形式,可以看成 1 × 1 1 \times 1 1×1卷积,由于BN层常常在Conv层之后,可以将两操作合并。

融合BN卷积

  • w B N ∈ R C × C \mathbf w_{BN} \in \mathbb R^{C \times C} wBNRC×C b B N ∈ R C \mathbf b_{BN} \in \mathbb R^{C } bBNRCBN的参数
  • w c o n v ∈ R C × C p r e . k 2 \mathbf w_{conv} \in \mathbb R^{C \times C_{pre}.k^2} wconvRC×Cpre.k2 b c o n v ∈ R C \mathbf b_{conv} \in \mathbb R^C bconvRCConv层的参数
  • F p r e v F_{prev} Fprev是卷积的输入
  • C p r e v C_{prev} Cprev:输入层的通道数量
  • k k k:卷积核大小

F p r e v F_{prev} Fprev的每个 k × k k \times k k×k部分reshape为一个维度为 k 2 . C p r e v k^2.C_{prev} k2.Cprev 的向量 f i , j f_{i,j} fi,j,因此Conv层加BN层的操作为:

f ^ i , j = W B N . ( W c o n v . f i , j + b c o n v ) + b B N \hat {\mathbf f}_{i,j}=\mathbf W_{BN} . (\mathbf W_{conv}.\mathbf f_{i,j}+\mathbf b_{conv})+\mathbf b_{BN} f^i,j=WBN.(Wconv.fi,j+bconv)+bBN

因此,我们可以用具有以下参数的单个卷积层替换这两层:

  • 滤波器权重 W W W W = W B N . W c o n v \mathbf W=\mathbf W_{BN}. \mathbf W_{conv} W=WBN.Wconv
  • 偏置bias: b = W B N . b c o n v + b B N \mathbf b=\mathbf W_{BN}. \mathbf b_{conv}+ \mathbf b_{BN} b=WBN.bconv+bBN

pytorch实现:

nn.Conv2d参数:

  • 滤波器权重, W \mathbf W Wconv.weight
  • bias, b \mathbf b bconv.bias

nn.BatchNorm2d参数:

  • scaling, γ \gamma γbn.weight
    shift, β \beta βbn.bias
  • mean estimate, μ ^ \hat \mu μ^bn.running_mean
  • variance estimate, σ 2 \sigma^2 σ2bn.running_var
  • ϵ \epsilon ϵ(for numerical stability)::bn.eps

代码实现:

import torchimport torchvisiondef fuse(conv, bn):fused = torch.nn.Conv2d(conv.in_channels,conv.out_channels,kernel_size=conv.kernel_size,stride=conv.stride,padding=conv.padding,bias=True)# setting weightsw_conv = conv.weight.clone().view(conv.out_channels, -1)w_bn = torch.diag(bn.weight.div(torch.sqrt(bn.eps+bn.running_var)))fused.weight.copy_( torch.mm(w_bn, w_conv).view(fused.weight.size()) )# setting biasif conv.bias is not None:b_conv = conv.biaselse:b_conv = torch.zeros( conv.weight.size(0) )b_bn = bn.bias - bn.weight.mul(bn.running_mean).div(torch.sqrt(bn.running_var + bn.eps))fused.bias.copy_( b_conv + b_bn )return fused# Testing# we need to turn off gradient calculation because we didn't write ittorch.set_grad_enabled(False)x = torch.randn(16, 3, 256, 256)resnet18 = torchvision.models.resnet18(pretrained=True)# removing all learning variables, etcresnet18.eval()model = torch.nn.Sequential(resnet18.conv1,resnet18.bn1)f1 = model.forward(x)fused = fuse(model[0], model[1])f2 = fused.forward(x)d = (f1 - f2).mean().item()print("error:",d)

参考:https://learnml.today/speeding-up-model-with-fusing-batch-normalization-and-convolution-3


http://chatgpt.dhexx.cn/article/36o4a1lx.shtml

相关文章

CV-BN

what Normalization是数据标准化(归一化,规范化),Batch 可以理解为批量,加起来就是批量标准化。 和卷积层,激活层,全连接层一样,BN层也是属于网络中的一层,常见排列 co…

BN算法

Motivation 2015年的论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》阐述了BN算法,这个算法目前已经被大量应用,很多论文都会引用这个算法,进行网络训练,可见其强大之处…

BN使用总结及启发

声明:文章仅作知识整理、分享,如有侵权请联系作者删除博文,谢谢! Batch Normalization视神经网络的经典结构,本文对BN的引入,训练、推理过程及BN的特性,进行整理。 1、数据预算处理&#xff0…

Batch Normalization (BN)简洁介绍

提出BN的文献: Ioffe, S., & Szegedy, C. (2015). Batch normalization: Accelerating deep network training by reducing internal covariate shift. 32nd International Conference on Machine Learning, ICML 2015, 1, 448–456. Batch Normalization&…

PyTorch 源码解读之 BN SyncBN:BN 与 多卡同步 BN 详解

目录 1. BatchNorm 原理 2. BatchNorm 的 PyTorch 实现 2.1 _NormBase 类 2.1.1 初始化 2.1.2 模拟 BN forward 2.1.3 running_mean、running_var 的更新 2.1.4 \gamma, \beta 的更新 2.1.5 eval 模式 2.2 BatchNormNd 类 3. SyncBatchNorm 的 PyTorch 实现 3.1 for…

BN和LN

covariate shift 是分布不一致假设之下的分支问题,指源空间和目标空间的条件概率是一致的,但边缘概率不同;而统计机器学习中的经典假设是 “源空间(source domain)和目标空间(target domain)的数…

BN的理解

机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经网络训练…

BN的作用

BN的作用一共有三个: 1 加速网络的收敛速度 2 控制了梯度消失的问题 3 防止过拟合 BN可以认为是在每一层的输入和上一层的输出之间加入一个计算层,对数据的分布进行额外的约束,从而增强模型的泛化能力。但是BN同时也降低了模型的拟合能力&am…

BN 层原理解析

1 训练数据为什么要和测试数据同分布? 看看下图,如果我们的网络在左上角的数据训练的,已经找到了两者的分隔面w,如果测试数据是右下角这样子,跟训练数据完全不在同一个分布上面,你觉得泛化能力能好吗&…

BN128曲线

1. 引言 BN系列椭圆曲线 E ( F p ) : y 2 x 3 b , 其 中 b ≠ 0 E(\mathbb{F}_p):y^2x^3b,其中b\neq 0 E(Fp​):y2x3b,其中b​0,由Paulo S. L. M. Barreto1 和 Michael Naehrig 在2005年论文 Pairing-Friendly Elliptic Curv…

【YOLO v4 相关理论】Normalization: BN、CBN、CmBN

一、Batch Normalization 论文:https://arxiv.org/pdf/1502.03167.pdf 源码: link. Batch Normalization是google团队在2015年论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的。 个人认为…

Betaflight BN880 GPS 简单测试

Betaflight BN880 GPS 简单测试 1. 源由2. 窗台对比测试3. 开阔区域测试3.1 GPS安装位置3.1.1 BN880 GPS 机尾打印支架 安装位置3.1.2 BN880 GPS 机头固定 安装位置3.1.3 M8N GPS 机尾打印支架 安装位置 3.2 M8N模块历史记录3.3 BN880模块第一次(机尾安装&#xff0…

BN(Batch Normalization):批量归一化

现在的神经网络通常都特别深,在输出层像输入层传播导数的过程中,梯度很容易被激活函数或是权重以指数级的规模缩小或放大,从而产生“梯度消失”或“梯度爆炸”的现象,造成训练速度下降和效果不理想。 随着训练的进行,…

通俗理解BN(Batch Normalization)

1. 深度学习流程简介 1)一次性设置(One time setup) - 激活函数(Activation functions) ​ - 数据预处理(Data Preprocessing) ​ - 权重初始化(Weight Initialization&#xff0…

为什么BN?batch normalization的原理及特点

1 什么是BN? 数据归一化方法,往往用在深度神经网络中激活层之前。其作用可以加快模型训练时的收敛速度,使得模型训练过程更加稳定,避免梯度爆炸或者梯度消失。并且起到一定的正则化作用,几乎代替了Dropout 2 原理 B…

【深度学习基础知识 - 07】BN的原理和作用

Batch Normalization也是深度学习中的一个高频词汇,这篇文章将会对其做一个简单介绍。 目录 1. BN的原理2. BN的作用3. BN层的可学习参数4. infer时BN的处理5. BN的具体计算步骤以及公式6. BN和L2参数权重正则化的区别 1. BN的原理 BN就是在激活函数接收输入之前对…

什么是BN(Batch Normalization)

什么是BN(Batch Normalization)? 在之前看的深度学习的期刊里,讲到了BN,故对BN做一个详细的了解。在网上查阅了许多资料,终于有一丝明白。 什么是BN? 2015年的论文《Batch Normalization: Accelerating Deep Networ…

深度学习—BN的理解(一)

0、问题 机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经…

Batch Normalization详解以及pytorch实验

Batch Normalization是google团队在2015年论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的。通过该方法能够加速网络的收敛并提升准确率。在网上虽然已经有很多相关文章,但基本都是摆上论文中的公式泛…

Java参数校验validation和validator区别

Java参数校验validation和validator区别 1. 参数校验概述2. validation与validator区别3. validation注解说明4. validator注解说明5. 日期格式化说明6. 实现验证6.1 引入依赖6.2 代码实现6.3 实现验证 1. 参数校验概述 常见的业务开发中无可避免的会进行请求参数校验&#xf…