深度模型压缩:BN和Conv/Fc参数合并
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度模型压缩:BN和Conv/Fc参数合并相关的知识,希望对你有一定的参考价值。
参考技术A BN一般在Conv之后,结构如下:Conv/Fc => BN => ReLU => Pool
我们可以把Conv和Fc都按照下述公式进行计算:
BN公式如下:
根据上述公式合并可得到:
TensorRT8 使用手记(1)模型测试 Conv+BN+Relu 结构融合
参考技术A在主流卷积神经网络模型中 Conv+BN+Relu 是一种常见的模型结构。在模型推理和训练中,BN层往往与其他层合并,以减少计算量。
node_of_325
node_of_326
node_of_327
在TensorRT中会对网络结构进行垂直整合,即将 Conv、BN、Relu 三个层融合为了一个层,即CBR融合
在BN层中,首先对输入 进行归一化( 输入张量的均值, 输入张量的方差),然后对归一化的结果进行比例缩放和位移。 [1] [2]
展开可得:
带入替换后可得:
此时可以将BN层视为一个1x1卷积层。
BN层的输入特征(Conv层的输出特征) 的形状为 ,对于Conv层:
,因此BN与Conv融合之后
融合之后:
线性整流函数(Rectified Linear Unit, ReLU)即: ,又称修正线性单元,是一种人工神经网络中常用的激活函数(activation function)。
在神经网络中,线性整流作为神经元的激活函数,定义了该神经元在线性变换之后的非线性输出结果。换言之,对于来自上一层卷积层的输入向量 ,使用线性整流激活函数可以得到输出:
在Int8量化模型中,Conv+ReLU 一般也可以合并成一个Conv进行运算 [3] 。
对于Int8ReLU,其计算公式可以写为 :
由于ReLU的输入(数值范围为 )和输出(数值范围为 )的数值范围不同,因此需要保证 和 、 和 是一致的。由于ReLU的截断操作,因此需要使用 和 ,即对于ReLU的输入,使用输出对应的 和 保证其对小于0截断的输入进行截断,对大于等于0的输入映射至[0,255]范围内。
在Int8Conv的计算过程中,首先使用量化计算公式 对输入和权重值进行量化计算,将其转换为数值范围为(0,255)的整数,在完成卷积计算后再将计算结果进行反量化计算。而 ReLU 本身没有做任何的数学运算,只是一个截断函数。假设Int8Conv的卷积输出为 122( ),则对应反量化输出 -0.3,经过Int8ReLU( ),对该值进行Int8量化,对应的输出为0。因此在ReLU层对输入进行截断之前,即可得到需要截断的数值。
因此,通过在完成卷积计算后直接使用 ReLU 后的 scale 和 zeropoint进行反量化,实现了将 ConvReLU融合。
以上是关于深度模型压缩:BN和Conv/Fc参数合并的主要内容,如果未能解决你的问题,请参考以下文章
基于pytorch的模型剪枝+模型量化+BN合并+TRT部署(cifar数据)
基于pytorch的模型剪枝+模型量化+BN合并+TRT部署(cifar数据)
基于pytorch的模型剪枝+模型量化+BN合并+TRT部署(cifar数据)