Toybrick

onnx转rknn模型精度下降严重

gaodian0323

新手上路

积分
41
发表于 2020-7-26 09:02:21    查看: 14522|回复: 6 | [复制链接]    打印 | 显示全部楼层
我在将onnx模型转化为rknn模型后发现精度下降严重,onnx与rknn的第一层卷积结果的第四位有效数字就不同,到第七个卷积层后第二个有效数字就不同了。我没有使用量化,原模型是32位的,怀疑是float32转换到rknn模型默认的float16数据类型的过程导致了精度下降,这个该怎么解决?
回复

使用道具 举报

gaodian0323

新手上路

积分
41
 楼主| 发表于 2020-7-27 11:00:47 | 显示全部楼层
有没有办法将onnx模型直接转换为权重完全一样的float32 rknn模型?
回复

使用道具 举报

gaodian0323

新手上路

积分
41
 楼主| 发表于 2020-9-2 22:32:27 | 显示全部楼层
Trouble_Shooting里面有如下的一条:
问:转换模型时如果 do_quantization 为 False,是否也会进行量化,量化精度是什么?(因为转换后模型体积小了接近一半)
答:分两种情况,当导入的模型是量化的模型时,do_quantization=False 会使用该模型里面的量化参数,具体请参考 1.9 的回答。当导入的模型是非量化模型时,do_quantization=False不会做量化的操作,但是会把权重从 float32 转成 float16,这块不会有精度损失

但是像上面这样的确存在较大误差的情况,是不是要手动设置量化精度为float32?这个要一层一层的设置么?
回复

使用道具 举报

gaodian0323

新手上路

积分
41
 楼主| 发表于 2020-9-3 08:15:18 | 显示全部楼层
我按混合量化的操作过程,把所有的层都放在了customized_quantize_layers字典里面,值都设为了float32。在混合量化step2之后生成的rknn文件比直接转化模型生成的大了一倍,但是运行时的结果反而更差了,这个该怎么解决?
回复

使用道具 举报

jefferyzhang

版主

积分
13532
发表于 2020-9-3 08:35:15 | 显示全部楼层
本帖最后由 jefferyzhang 于 2020-9-3 08:45 编辑

可以进置顶帖的RKNN QQ群讨论。
你可能对RKNN有所误解,RKNPU存在的目的是以低功耗运行大算力模型,目标就是在保持一定精度的情况下完成量化提高算力,
你却在反其道而行,FP32下NPU运算速度甚至可能不如板载CPU,完全没有意义,
它的存在仅仅是在做混合量化时候某些层对精度比较敏感情况下可以用FP32提高精度。
玩RKNPU是有一定门槛和需要时间去调试的,如果想模型拿过来一口气转完就部署产品实现低功耗高算力,那是几乎不可能实现的,那你不如直接用我们rockx已经做好的模型和接口。
回复

使用道具 举报

YeeLearn

注册会员

积分
184
发表于 2020-11-2 22:33:21 | 显示全部楼层
请问问题解决没?我这边也会出现不量化精度下降严重的问题,不知道什么原因导致。
回复

使用道具 举报

jefferyzhang

版主

积分
13532
发表于 2020-11-3 08:58:08 | 显示全部楼层
YeeLearn 发表于 2020-11-2 22:33
请问问题解决没?我这边也会出现不量化精度下降严重的问题,不知道什么原因导致。 ...

1. 调试模型输出,看下是精度下降还是压根算的就是错的
2. 调试每一层打印输出,看下哪层输出精度差异较大,或者运算错误。
3. 使用混合量化,不对该层进行量化。
4. 重复以上步骤,直到得到一个满意的精度

(如依然有问题请仔细拜读rknn-toolkit提供的文档和解决方案,并加入置顶帖RKNN官方qq群进行讨论)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表