深度学习算法优化系列十一 | 折叠Batch Normalization

BN算法(Batch Normalization)的原理和作用 文章目录一、BN算法概念二、Covariate Shift问题三、BN算法产生的背景四、BN算法的实现和优点4.1 BN算法的实现4.2 BN算法在网络中的作用五、参考文献 一、BN算法概念 传统的神经网络,只是在将样本x输入到输入层之前对x进行标准化处理,以降低样本间的差异性。BN是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化。 (那为什么需要对每个隐藏层... 阅读详情

好久不见,优化系列得继续更啊。。。

前言

今天来介绍一个工程上的常用Trick,即折叠Batch Normalization,也叫作折叠BN。我们知道一般BN是跟在卷积层后面,一般还会接上激活函数,也就是conv+BN+relu这种基本组件,但在部署的时候前向推理框架一般都会自动的将BN和它前面的卷积层折叠在一起,实现高效的前向推理网络,今天我就从原理和实现来讲一讲这个操作。

原理

我们知道卷积层的计算可以表示为:

然后BN层的计算可以表示为:

我们把二者组合一下,公式如下:

然后令

那么,合并BN层后的卷积层的权重和偏置可以表示为:

值得一提的是,一般Conv后面接BN的时候很多情况下是不带Bias的,这个时候上面的公式就会少第二项。

Pytorch代码实现

原理介绍完了,接下来我们来看一下代码实现,就以Pytorch的代码为例好了。

def fuse(conv, bn):
    global i
    i = i + 1
    # ********************BN参数*********************
    mean = bn.running_mean
    var_sqrt = torch.sqrt(bn.running_var + bn.eps)
    gamma = bn.weight
    beta = bn.bias
    # *******************conv参数********************
    w = conv.weight
    if conv.bias is not None:
        b = conv.bias
    else:
        b = mean.new_zeros(mean.shape)

    if(i >= 2 and i <= 7):
        b = b - mean + beta * var_sqrt
    else:
        w = w * (gamma / var_sqrt).reshape([conv.out_channels, 1, 1, 1])
        b = (b - mean)/var_sqrt * gamma + beta
    fused_conv = nn.Conv2d(conv.in_channels,
                         conv.out_channels,
                         conv.kernel_size,
                         conv.stride,
                         conv.padding,
                         groups=conv.groups,
                         bias=True)
    fused_conv.weight = nn.Parameter(w)
    fused_conv.bias = nn.Parameter(b)
    return fused_conv

可以看到这个代码实现和上面介绍的公式完全对应,实现了折叠BN的效果。

Caffe代码实现

下面这个代码实现了将Mobilenet Caffe模型的卷积和BN进行合并的代码,亲测无误,放心使用。

由于完整代码太长,我放这个工程里了:https://github.com/BBuf/cv_tools/blob/master/merge_bn.py

思考

  • 从公式推导可知,只有Conv后接BN才可以折叠,Preact结构的ResNet不可以折叠BN。

  • 如果是反卷积接的BN,如何合并?

效果

在参考2的博客中看到看到了折叠BN的速度测试结果,分别在1080Ti和i7 CPU上对比了Resnet50 模型合并BN层前后的性能,可以看到分类精度保持不变,速度显著提升,具体测试结果如下:

模型CPU前向时间GPU前向时间
Resnet50(合并前)176.17ms11.03ms
Resnet50(合并后)161.69ms7.3ms
提升10%51%

附录

  • 参考1:https://github.com/666DZY666/model-compression

  • 参考2:https://blog.youkuaiyun.com/kangdi7547/article/details/81348254

(完)


Jupyter Notebook与深度学习实战:从实验到生产部署 Jupyter Notebook作为交互式计算环境,通过单元格设计和即时反馈机制,极大提升了数据科学和机器学习的工作效率。在深度学习领域,理解CNN、RNN和Transformer等核心架构的差异至关重要,例如CNN擅长处理空间数据,而Transformer的自注意力机制在大语言模型中表现卓越。模型训练中的学习率衰减、Batch Normalization和早停机制等技巧能显著提升性能。从实验到生产部署,需要将Jupyter代码重构为模块化脚本,并使用Docker和ONNX等工具实现工程化。本文结合Kagg 阅读详情

相关推荐

好未来视觉算法岗秋招笔试复盘:考点拆解与解题思路

计算机视觉领域,深度学习模型的工程落地能力已成为算法工程师的核心竞争力。目标检测作为最常见的基础任务,其背后的NMS、锚框机制、损失函数设计等细节,直接影响模型在真实场景中的表现。无论是教育场景中的拍照搜题,还是工业质检中的缺陷识别,掌握这些原理都能帮助开发者更高效地优化模型精度与推理速度。一场真实的视觉算法岗秋招笔试复盘,系统梳理了CNN基础、目标检测、模型优化等高频考点,并结合编程题解析了NMS与旋转框IoU的实现思路,为准备算法岗面试的读者提供了一份完整的复习参考。

weixin_33889245的博客 384

深度学习算法优化系列三 | Google CVPR2018 int8量化算法

1. 前言 这是Google在CVPR 2018上发表的一篇int8量化的论文,题目为《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》。也是入门量化最经典的论文之一。论文介绍了一种只使用整数运算的量化方式,相比于浮点数运算效率更高。一起先来看看这篇论文吧。论文...

I good vegetable a! 2220

六大深度学习优化器实战:加速训练、压缩显存、提升稳定性

优化器是深度学习训练的核心引擎,其本质并非简单调整学习率,而是重构模型参数更新的动力学路径。从基础的SGD with Momentum到自适应算法如Adam、RMSProp,再到面向大规模训练的LAMB和高精度场景的Nadam,不同优化器通过动量累积、梯度平方归一化、偏差校正及层间自适应等机制,显著影响收敛速度、显存占用与训练鲁棒性。尤其在大模型微调、小样本学习与分布式训练中,合理选择并调优优化器可实现10倍级收敛加速与50%显存压缩。本文聚焦工业级实测经验,覆盖PyTorch六大主流优化器的原理差异、参数

diegouyi3472的博客 359

BN层详解(含有公式推导过程)

如果以上的你懂看明白的话,BN你就理解的差不多了。BN层就是用在激活函数前,用来使上一层的输出,分布在均值为0,方差为1的情况下,也就是对下一层的输入做归一化的操作,这样就能够使它经过激活函数时能够有一定的梯度,从而避免值太大而进入饱和区,梯度就非常小了,不利于梯度下降。并且除了均值和方差,BN层还有自己的学习参数γ和β,网络通过学习来得到想要的数据分布,参数γ和β在训练中通过反向传播中的γ与β求得梯度,从而不断改变每个通道的γ和β参数。

Orange_sparkle的博客 2万+

深度学习正则化实战:从原理到生产级模型防护体系

正则化是深度学习模型泛化能力的基石,其本质是通过约束参数空间、调控梯度流动与增强结构鲁棒性,防止过拟合与数据漂移导致的线上失效。L1/L2正则化并非简单加权惩罚,而是对权重分布的几何重塑;Dropout实为隐式多模型集成,提升路径冗余;BatchNorm则是深层网络中梯度传播的稳定器。在医疗、金融、工业等高风险场景中,正则化直接决定模型可解释性、嵌入式部署可行性及FDA/监管合规性。本文聚焦真实产线问题——跨设备泛化骤降、节假日流量突变失效、推理抖动等,系统拆解L1/L2、Dropout、BatchNorm

weixin_32181267的博客 261

保姆级教程:不用看古早代码,5分钟搞懂泛微ecology9附件存储与接口调用

本文详细解析了泛微ecology9附件存储与接口调用的核心原理,提供从基础概念到实战操作的完整指南。通过拆解文档化附件设计理念、解析RESTful接口参数,并给出Python代码示例,帮助开发者快速掌握附件上传与业务集成的关键技巧,提升二次开发效率。

weixin_28688385的博客 351

BN折叠及其量化

BN折叠及其量化

cyz0202的博客 1571

深度学习模型轻量化方法之【量化】

量化虽然有着硬件友好和功效提升的特点,但它也引入了模型性能的折衷。因此,设计有效的量化策略需要在模型大小、性能以及运算速度之间做出平衡。随着深度学习算法和硬件加速技术的快速发展,量化方法在使深度网络轻量化和提高部署效率方面持续发挥着重要作用。

m0_73916791的博客 2850

深度学习正则化与加速:Dropout与Batch Normalization详解

在深度神经网络训练中,正则化技术和训练加速方法是提升模型性能的关键。Dropout通过随机屏蔽神经元防止过拟合,其本质是集成学习的隐式实现;Batch Normalization则通过标准化层输入分布来加速收敛,有效解决内部协变量偏移问题。这两种技术在计算机视觉和自然语言处理领域有广泛应用,如ResNet、Transformer等经典架构均采用它们作为基础组件。工程实践中,合理组合Dropout与BN能显著提升模型泛化能力,在电商评论分析、医疗影像识别等场景中验证准确率可提升2-3%。针对不同网络结构(CN

weixin_33711647的博客 360

STM32学习笔记(江协科技)-----OLED显示屏

SSD1306简介:•SSD1306是一款OLED/PLED点阵显示屏的控制器,可以嵌入在屏幕中,用于执行接收数据、显示存储、扫描刷新等任务••驱动接口:128个SEG引脚和64个COM引脚,对应128*64像素点阵显示屏••内置显示存储器(GDDRAM):128*64 bit128*8 ByteSRAM••供电:IC逻辑),VCC=7~15V(面板驱动)••通信接口:8位6800/8080并行接口,3/4线SPI。

lu322f的博客 1062

在线考试系统源码+数据库+word+ppt(高分毕业设计)

本系统通过Spring Cloud实现微服务拆分,将授权、考试、监控等功能解耦,既保证了系统的扩展性,也便于后期维护。基于OAuth2.0的单点登录,解决多服务统一认证问题;考试与练习模式分离,满足不同场景需求;集成Druid与Hystrix,保障系统监控与稳定性。

weixin_44355158的博客 738

来聊聊批归一化BN(Batch Normalization)层

点击上方“AI算法修炼营”,选择加星标或“置顶”标题以下,全是干货一、Batch Normalization是什么?Batch Normalization (BN) 是最早出现的,也通常...

AI算法修炼营的博客 3684

WPF实战:利用Live Charts实现高性能动态曲线可视化

本文详细介绍了如何在WPF中使用Live Charts实现高性能动态曲线可视化,特别适用于工业监控和金融分析等实时数据场景。通过增量渲染、内存复用和硬件加速等核心技术,Live Charts能够高效处理高频数据更新,显著提升图表流畅度。文章提供了从基础实现到工业级优化的完整解决方案,帮助开发者应对各种性能挑战。

weixin_29189373的博客 408

使用Batch Normalization折叠来加速模型推理

作者:Nathan Hubens编译:ronghuaiyang来自:AI公园导读如何去掉batch normalization层来加速神经网络。介绍Batch Normalization...

zenRRan的博客 655

VS Code 重大更新:Agent Skills完美支持!

代码不会骗人,但你的 LLM 可能会编个故事——除非你给它一本《技能手册》。——某位深夜调试成功的 Go 工程师。

weixin_44058951的博客 3461

基于深度学习的番茄成熟度检测系统——YOLOv5、YOLOv8、YOLOv10及UI界面的实现

YOLO是一种快速且准确的目标检测模型,近年来,YOLOv5、YOLOv8和YOLOv10作为YOLO系列的重要版本,分别在速度、精度和效率上进行了优化。下面我们简要介绍这些模型。本文介绍了如何基于YOLOv5、YOLOv8和YOLOv10等深度学习模型,结合PyQt5设计一个番茄成熟度检测系统。通过训练模型、优化算法和设计用户友好的界面,我们能够构建一个高效且准确的番茄成熟度检测系统,广泛应用于农业自动化和智能化管理中。

YOLO 1002

深度学习归一化全解析:从数据预处理到Batch Norm的实战避坑指南

在模型训练中,特征尺度的差异往往导致收敛缓慢、loss震荡甚至梯度爆炸。归一化作为深度学习的核心预处理技术,通过统一特征量纲,让优化器在参数空间中均衡搜索,从而显著提升训练稳定性与收敛速度。从基础的Z-score标准化到网络结构中的Batch Normalization、Layer Norm与Group Norm,不同归一化策略分别适用于大batch视觉任务、序列建模与小batch场景。实际工程中还需关注测试集信息泄漏、BN在推理阶段的模式切换,以及部署时的算子折叠优化。理解归一化的数学本质与统计维度选择,

weixin_29054245的博客 327

华为OD机考双机位C卷:精准核酸检测 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 精准核酸检测,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 精准核酸检测。

qq_45776114的博客 1729

深度学习入门(六)——模块、正则化与工程调优全解析

本文系统梳理了深度学习中工程优化的关键模块,包括激活函数、批归一化、Dropout、权重初始化和正则化方法。文章详细分析了各类激活函数的优缺点及适用场景,如Sigmoid、ReLU及其变种,以及Transformer常用的GELU;讲解了BatchNorm的原理和在CNN中的应用;介绍了Dropout防止过拟合的机制;强调了合理初始化对训练的重要性;并提供了工程调优的实用技巧,如梯度监控、学习率调整等。这些模块共同构成了深度学习模型的"骨架",是确保模型稳定训练和良好泛化的基础。

htw250056的博客 874

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【IT大学生必会】深度学习各算法的优缺点和适用场景

.

CKissjy的博客 1411

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

杂谈1——深度学习简易知识积累

浅浅记录一些知识,一方面做一些分享与自己的思考,另一方面作为笔记记录下来。

qq_45848817的博客 644

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OpenClaw性能优化:从GPU驱动到推理引擎的系统级排查指南

在深度学习模型部署中,推理性能瓶颈往往源于系统环境而非模型本身。理解GPU计算原理、CUDA驱动兼容性以及显存管理机制是优化基础。通过系统化诊断硬件资源匹配度与数据流转效率,可以显著提升服务吞吐量与响应速度。实践中,合理配置批处理、启用异步框架以及应用计算图优化技术,能够释放模型在真实场景中的潜力。本文聚焦OpenClaw等AI工具的性能调优,针对GPU初始化失败、显存溢出等常见工程问题,提供从基础设施到推理引擎的完整解决方案,帮助开发者快速定位瓶颈,实现高效稳定的模型服务化部署。

weixin_33695082的博客 391

深度学习模型跨框架导入MATLAB:TensorFlow、PyTorch与ONNX实战指南

深度学习模型部署与集成常面临跨框架协作的挑战,不同框架训练的模型需在统一环境中进行验证、优化与部署。模型导入的核心在于计算图转换与算子映射,确保模型精度与行为一致。其技术价值在于降低算法迁移门槛,实现跨框架资产复用。在工程实践中,针对TensorFlow SavedModel、PyTorch TorchScript及ONNX开放标准,MATLAB提供了标准化导入路径。例如,通过SavedModel完整打包方案可处理复杂控制流,而ONNX作为通用接口,尤其适合多框架模型统一管理。掌握这些方法,能高效利用MAT

weixin_30363509的博客 358

Python深度学习:从入门到实战

亲爱的读者,欢迎您翻开这本书。我们即将探索的,是深度学习的宇宙——一个由数据、算法与算力构筑的奇妙世界。它既是严谨的科学,也是创造的艺术,更是一条通往未来智慧的修行之路。本书将带您从最基础的数学原理出发,亲手搭建神经网络,驾驭Transformer等前沿模型,最终将智慧转化为现实世界的价值。请放下畏惧,保持好奇。这不仅是一次知识的学习,更是一场思维的远行。来,随我一起,开启这趟非凡的旅程吧。

weixin_45747731的博客 300

神经网络激活函数全解析:从ReLU到GELU,如何选择与优化

在深度学习与神经网络中,激活函数是实现模型非线性的核心组件,它决定了网络能否拟合复杂的数据模式。其基本原理是通过引入非线性变换,使多层网络能够超越线性模型的局限,从而学习到数据中的高阶特征与抽象表示。这一技术价值在于,它直接解决了梯度消失与梯度爆炸等训练难题,是构建深层、高性能模型的基础。从卷积神经网络(CNN)到Transformer架构,激活函数的选择直接影响模型的收敛速度、泛化能力与最终性能。在实际工程中,ReLU因其计算高效性成为默认选择,而GELU凭借其在Transformer中的卓越表现成为前沿

weixin_30425949的博客 357
上一篇: 出不了门的日子,我选择在 GitHub 上快乐的打游戏
下一篇: 4个步骤成功构建出一个机器学习团队
Wang_AI
博客等级 码龄12年 996粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值