量化原理入门——Folding BN RELU

本文介绍量化中如何将BatchNorm和ReLU合并到Conv中。

Folding BatchNorm

BatchNorm是google提出的一种加速神经网络训练的技术,在很多网络中基本是标配。回忆一下BatchNorm其实就是在每一层输出的时候做了一遍归一化操作:

Input:Values of x over a mini-batch:B={x_{1...m}};

Parameters to be learned:\gamma\beta

output:y_{i} = BN_{\gamma ,\beta }(x_{i}))

\mu _{B} \leftarrow \frac{1}{m}\sum_{i=1}^{m}x_{i}  //mini batch mean

\sigma _{B}^{2}\leftarrow \frac{1}{m}\sum_{i=1}^{m}(x_{i} - \mu _{B})^{2}  // mini batch variance

\widehat{x}_{i} \leftarrow \frac{x{i} - \mu_{B}}{\sqrt{\sigma ^{2}_{B} + \epsilon }} // normalization

y_{i} \leftarrow \gamma \widehat{x_{i}} + \beta \equiv BN_{\gamma ,\beta }(x_{i}) // scale and shift

Algorithm1:Batch normalizing transform, applied to activation x over a mini-batch。其中x_{i}是网络中间某一层的激活值,\mu_{B}\sigma ^{2}_{B}分别是其均值和方差,y_{i}则是经过BN后的输出。

一般卷积层与BN合并

 Folding BatchNorm不是量化才有的操作,在一般网络中,为了加速网络推理,我们也可以把BN合并到Conv中。

合并的过程是这样的,假设有一个已经训练好的Conv和BN:

假设Conv的weight和bias分别是w和b,那么卷积层的输出为:

y=\sum_{i}^{N}w_{i}x_{i} + b  (1)

途中BN层的均值和方差可以表示为\mu _{y}\sigma ^{2}_{y},那么BN层的输出y_{bn}可以表示为:

y_{bn}= \gamma \widehat{y} + \beta = \gamma \frac{y - \mu _{y}}{\sqrt{\sigma ^{2}_{y} + \varepsilon }} + \beta(2)

然后我们将(1)式代入(2)式得:

y_{bn}= \gamma \frac{\sum_{i}^{N}w_{i}x_{i} + b - \mu _{y}}{\sqrt{\sigma ^{2}_{y} + \varepsilon }} + \beta (3)

我们用\gamma {}'来表示\frac{\gamma }{\sqrt{\sigma^{2}_{y} + \epsilon }}, 那么(3)式可以表示为:

y_{bn}= \sum_{i}^{N} \gamma{}'w_{i}x_{i} + \gamma {}'(b - \mu _{y}) + \beta (4)

可以发现,(4)式形式上跟(1)式一模一样,因此它本质上也是一个Conv运算,我们只需要用\omega {}' = \gamma {}'\omega _{i}b{}' = \gamma {}'(b - \mu _{y}) + \beta来作为原来卷积的weight和bias,就相当于将BN的操作合并到了Conv里面。实际inference的时候,由于BN层的参数已经固定了,因此可以把BN层folding到Conv中,省去BN层的计算开销。

 卷积层和BN层合并,从pytorch官方扒出的对应代码如下:传送

def fuse_conv_bn_weights(conv_w: torch.Tensor,conv_b: Optional[torch.Tensor],bn_rm: torch.Tensor,bn_rv: torch.Tensor,bn_eps: float,bn_w: Optional[torch.Tensor],bn_b: Optional[torch.Tensor],transpose: bool = False
) -> Tuple[torch.nn.Parameter, torch.nn.Parameter]:r"""Fuse convolutional module parameters and BatchNorm module parameters into new convolutional module parameters.Args:conv_w (torch.Tensor): Convolutional weight.conv_b (Optional[torch.Tensor]): Convolutional bias.bn_rm (torch.Tensor): BatchNorm running mean.bn_rv (torch.Tensor): BatchNorm running variance.bn_eps (float): BatchNorm epsilon.bn_w (Optional[torch.Tensor]): BatchNorm weight.bn_b (Optional[torch.Tensor]): BatchNorm bias.transpose (bool, optional): If True, transpose the conv weight. Defaults to False.Returns:Tuple[torch.nn.Parameter, torch.nn.Parameter]: Fused convolutional weight and bias."""conv_weight_dtype = conv_w.dtypeconv_bias_dtype = conv_b.dtype if conv_b is not None else conv_weight_dtypeif conv_b is None:conv_b = torch.zeros_like(bn_rm)if bn_w is None:bn_w = torch.ones_like(bn_rm)if bn_b is None:bn_b = torch.zeros_like(bn_rm)bn_var_rsqrt = torch.rsqrt(bn_rv + bn_eps)if transpose:shape = [1, -1] + [1] * (len(conv_w.shape) - 2)else:shape = [-1, 1] + [1] * (len(conv_w.shape) - 2)fused_conv_w = (conv_w * (bn_w * bn_var_rsqrt).reshape(shape)).to(dtype=conv_weight_dtype)fused_conv_b = ((conv_b - bn_rm) * bn_var_rsqrt * bn_w + bn_b).to(dtype=conv_bias_dtype)return (torch.nn.Parameter(fused_conv_w, conv_w.requires_grad), torch.nn.Parameter(fused_conv_b, conv_b.requires_grad))

 

   量化BatchNorm Folding

量化网络时可以用同样的方法把BN合并到Conv中。

如果量化时不想更新BN的参数(后训练量化),那我们就先把BN合并到Conv中,直接量化新的Conv即可。

如果量化时需要更新BN的参数(比如量化感知训练),那也很好处理。Google把这个流程的心法写在一张图上了:

由于实际 inference 的时候,BN 是 folding 到 Conv 中的,因此在量化训练的时候也需要模拟这个操作,得到新的 weight 和 bias,并用新的 Conv 估计量化误差来回传梯度。

量化感知训练后期再做详细的解读和补充。

Conv和ReLU合并

在量化中,Conv + ReLU这样的结构一般也是合并成一个Conv进行运算的,而这一点在全精度模型中则办不到。 

之前的文章中有介绍过,ReLU前后应该使用同一个scale和 zeropoint。这是因为ReLU本身没有做任何的数学运算,只是一个截断函数,如果使用不同的scale和zeropoint,将会导致无法量化回float域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4开发BIM程序 的 流程

某机构BIM设计研究中心主任马晓龙,他对编程颇有研究。今天他会用通俗易懂的语言来讲解基于游戏引擎UE4的BIM技术可视化应用。对于想要自己开发程序的设计师一定要读一下! 1)关于UE4——UE4是什么? 可以简单的理解为,一…

PPT可以转换成电子画册吗

答案是当然可以,PPT是可以转换成电子画册的。电子画册具有3D仿真翻页的效果,而且还可以很好地保存图片和文字信息,并方便在各种设备上查看。 要将PPT转换成电子画册,只需要一个工具就能轻松转换。给大家推荐这款转换工具&#xff…

是时候将javax替换为Jakarta了

开始 相信很多朋友在使用新版本的Spring的时候,发现了一些叫jakarta的包,看起来有点陌生。 很多时候,比较纠结不知道该导入哪一个包。 jakarta其实就是之前的javax。 主要JavaEE相关的,从之前javax名字也可以看出来&#xff0…

电脑系统坏了用U盘重装系统教程

我们平时办公、学习都会用到电脑,如果电脑系统坏了,就会影响自己正常使用电脑,这时候就可以通过U盘来重装一个正常的操作系统。如果您不知道具体的重装操作步骤,那么可以参考下面小编分享的利用U盘快速完成操作系统重装的步骤介绍…

Yapi接口管理平台Centos7容器部署

文章目录 0.Docker部署1.Docker部署1.1 MongoDB1.2 下载 Yapi 镜像1.3 初始化数据库1.4 启动 Yapi 服务1.5 访问 Yapi 2.docker-compose部署2.1 创建容器网络2.2 创建2.3 创建 mongodb-compose2.4 创建 yapi-compose2.5 启动容器2.6 访问 Yapi 0.Docker部署 参考:C…

Python中使用SQLite数据库的方法2-2

3.3.2 创建表单及字段 通过“3.2 创建Cursor类的对象”中创建的Cursor类的对象cur创建表单及字段,代码如图5所示。 图5 创建表单及字段 从图5中可以看出,通过Cursor类的对象cur调用了Cursor类的execute()方法来执行SQL语句。该方法的参数即为要指定的S…

基于CNN和双向gru的心跳分类系统

CNN and Bidirectional GRU-Based Heartbeat Sound Classification Architecture for Elderly People是发布在2023 MDPI Mathematics上的论文,提出了基于卷积神经网络和双向门控循环单元(CNN BiGRU)注意力的心跳声分类,论文不仅显示了模型还构建了完整的…

新能源汽车制造设备状态监测:无线温振传感器的应用

随着全球对环境保护的关注度不断增加,新能源汽车的市场需求正在逐步扩大。而为了满足这一需求,新能源汽车制造企业必须依赖高效、可靠的设备来进行生产制造。然而,设备状态的监测与维护对于保证生产线的稳定运行至关重要。无线温振传感器作为…

【数据结构】顺序表与单链表的增删查改

文章目录 前言顺序表增删查改顺序表的定义与初始化增删查改操作测试代码完整代码 单链表的增删查改数据结构定义动态申请节点单链表的尾插和头插单链表的尾删和头删单链表的查找单链表的插入和删除销毁链表测试代码完整代码 总结 前言 在计算机编程领域,数据结构是…

SpringBoot+AOP+Redis 防止重复请求提交

本文项目基于以下教程的代码版本&#xff1a; https://javaxbfs.blog.csdn.net/article/details/135224261 代码仓库: springboot一些案例的整合_1: springboot一些案例的整合 1、实现步骤 2.引入依赖 我们需要redis、aop的依赖。 <dependency><groupId>org.spr…

Unity C# Mp3 Mp4 音频 视频 合成

需求 将声音文件合并到视频中 限制 暂时只支持Windows使用 准备 下载ffmpeg.exe 解压后得到exe https://ffmpeg.org/download.html#releases 注意事项&#xff1a; 目录要在一起 代码 public void StartExe(){if (File.Exists(ffmpegExe)){ string mp4;string mp3;//…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第四节 参数传递对堆栈的影响1 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](http…

将H5封装为App:实现跨平台移动应用开发的新趋势

H5技术指的是HTML5、CSS3和JavaScript等一系列前端技术的综合应用。它具有跨平台、开发成本低、开发周期短等优势&#xff0c;可以快速实现丰富的界面和交互效果。而原生应用开发受限于操作系统的差异&#xff0c;需要分别开发不同平台的应用&#xff0c;这就增加了开发成本和工…

2023年度总结(找到工作)

转眼2023年结束了&#xff0c;今天已经12月29日了。从2022年12月25日考研失败后&#xff0c;2023年就变成了找工作以及上班度日的时光了。针对2023年&#xff0c;我想对自己所说的是&#xff1a;终于找到工作了。作为一个普通的专升本&#xff0c;考研落榜生来说&#xff0c;能…

熊猫目标检测数据集VOC格式1200张

熊猫是中国的国宝&#xff0c;也是世界上最受人喜爱的动物之一。熊猫以其独特的外貌和与生俱来的文化象征意义而闻名于世。它们是一种大型的食草动物&#xff0c;主要分布在中国中部地区的竹林和高山地带。 熊猫的身形圆润笨拙&#xff0c;黑白分明&#xff0c;拥有圆润的脸庞…

C++进阶--多态

多态 一、多态的概念二、多态的定义及实现2.1 构成多态的两个硬性条件2.2 虚函数的重写2.2.1 协变(基类与派生类虚函数返回值类型不同)2.2.2 析构函数的重写(基类与派生类析构函数的名字不同) 2.3 final和override2.4 重载、覆盖&#xff08;重写&#xff09;、隐藏&#xff08…

基于Java图书借阅管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

英语中修饰头发的形容词顺序是怎么样的(加补充)

一、英语描述发型 :漂亮长短形状颜色头发。 例如她有一头美丽的黑色的直发。She has beautiful long straight black hair.二、多个形容词修饰同一名词时的顺序是固定的&#xff0c;其顺序为&#xff1a;①冠词、指示代词、不定代词、物主代词②序数词基数词③一般性描绘形容词…

小红书品牌曝光方式有哪些,小红书投放总结!

辛辛苦苦撰写了笔记&#xff0c;却没有人看。不懂平台的曝光策略&#xff0c;就无法获得预期的营销结果。今天就来分享下小红书品牌曝光方式有哪些&#xff0c;小红书投放总结&#xff01; 第一招&#xff0c;打造账号IP 在小红书平台进行传播&#xff0c;打造账号IP非常重要。…

Apache Doris (五十六): Doris Join类型 - 四种Join对比

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 Doris 支持两种物理算子,一类是…