赞
踩
以前部署 HopeNet 的时候,发现了relu6与relu的差异。具体就是 relu 模型量化后精度下降 14%,relu6 模型量化(指量化前直接替换成relu,再做量化)后精度下降 2.5%。这两个模型除了 backbone、激活函数不一样,其他都一样。所以 relu6 可以减少量化精度损失?因为上面两个模型backbone不一样,所以考虑再进行一个条件更严格的对比实验。
特意选了 MobileNet v2,它的激活函数刚好是 relu6,测试数据集类别数是 2,数据集大小为正负类各 500个,精度就是分类的准确率,然后还给每个类别计算了类别精度。我们训练两款模型 MobileNet v2-relu 和 MobileNet v2-relu6 ,它们除了激活函数不同,其余都一样。pytorch 下面训练、测试,因为我的 caffe 不支持 relu6。rgb图片转为bgr格式的图片demo在这里。
1. pytoch 推理结果如下:
模型 | MobileNet v2-relu |
---|---|
总精度 | 97.9% |
0 类别精度 | 97.2% |
1 类别精度 | 98.6% |
模型 | MobileNet v2-relu6 |
---|---|
总精度 | 97.6% |
0 类别精度 | 97.6% |
1 类别精度 | 97.6% |
2. 海思 nnie 推理结果
模型 | MobileNet v2-relu |
---|---|
总精度 | 97.7% |
0 类别精度 | 97.0% |
1 类别精度 | 98.4% |
模型 | MobileNet v2-relu6 |
---|---|
总精度 | 97.8% |
0 类别精度 | 97.6% |
1 类别精度 | 98.0% |
注:海思不支持 relu6(勘正一下,后来我在海思上部署relu6成功,相关博客),我是 pytorch 转 caffe 时,直接用 relu 替换的。
由上面数据可见,虽然 MobileNet v2-relu 精度损失不大,但是 relu6 对减少量化精度损失还是有着积极作用。
感觉差距不是很明显,说服力不是很强,考虑以后再做些实验,提高说服力。
自从发现这个问题而来,就一直在思考背后的原因,虽然该结论还没有得到多个案例的支持,但还是想简单探讨一下,各位老哥看看就好,说的不好可以指出来,我进行修改,谢谢!
一开始思考很久,一直不得门路,后来看量化相关的技术博客时,提到关于权值量化(量化相关博客,这个博客更方便新手学习),想到会不会是:relu 导致权值范围相差过大,而使用 relu6 则缓解了这一现象。
所以下面有两个问题需要讨论:
1. 为什么 relu6 能缓解权值相差过大的情况?
2. 为什么权值相差过大会使得量化后精度下降?
先说第一个问题,请出链式法则,
上图是 简单的 tensor 流程图,下图是 relu6 的图。
∂ l o s s ∂ w = ∂ l o s s ∂ y ∗ ∂ y ∂ B ∗ ∂ B ∂ w = ∂ l o s s ∂ y ∗ ∂ y ∂ B ∗ A \frac{
{\partial loss}}{
{\partial w}} = \frac{
{\partial loss
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。