MXNet转onnx问题点记录_onnx bn层-程序员宅基地

技术标签: 深度学习  mxnet  

MXnet转onnx时碰到的问题记录

最近将mxnet转onnx时碰到很多问题,在查找过程中发现解决方法,特记录下;转换过程主要参考如下链接中的解决方法
mxnet模型转onnx模型 作者liguiyuan112
Insightface中ArcFace MxNet2ONNX踩坑
MXNet Symbol Batch Normalization fix_gamma=True转ONNX方法

主要问题

  1. 转换时BN层出现错误
onnx.onnx_cpp2py_export.checker.ValidationError: Unrecognized attribute: spatial for operator BatchNormalization

==> Context: Bad node spec: input: "conv_1_conv2d" input: "conv_1_batchnorm_gamma" input: "conv_1_batchnorm_beta" input:"conv_1_batchnorm_moving_mean" input:"conv_1_batchnorm_moving_var" output: "conv_1_batchnorm" name: "conv_1_batchnorm" op_type: "BatchNormalization" attribute { name: "epsilon" f: 0.001 type: FLOAT } attribute { name: "momentum" f: 0.9  type: FLOAT } attribute { name: "spatial" i: 0 type: INT }

解决方法:参考mxnet模型转onnx模型 作者liguiyuan112 ,修改pip安装的mxnet文件夹下mxnet/contrib/onnx/mx2onnx/_op_translations.py中 359行左右的 spatial=0 注释掉即可

  1. 推理报错
    2.1. TypeError: 127.5 has type numpy.float32, but expected one of: int, long, float
    2.2. [ONNXRuntimeError] : 1 : FAIL : Type Error: Type parameter (T)bound to different types (tensor (double) and tensor(float) in node (conv_1_conv2d).
    2.3. [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Non-zero status code returned while running PRelu node. Name:‘conv_1_relu’… Attempting to broadcast an axis by a dimension other than 1. 56 by 64
    参考Insightface中ArcFace MxNet2ONNX踩坑,其代码主要在github: zheshipinyinMc/arcface_retinaface_mxnet2onnx

  2. 推理结果不一致
    上述1和2步骤完成后,可以得到模型,但实际推理过程中发现onnxruntime推理结果和mxnet推理结果不一致,检查每层结果,发现在batchnorm层后两者之间的输出结果不一致,查询后,发现是mxnet中当batchnorm层中的参数fix_gamma为True时,其前向推理时 gamma参数不参与计算,所以需要将gamma参数的值置为1,可参考如下代码,注意修改 这一行代码,if ‘batchnorm_gamma’ in k or ‘fc1_gamma’ in k: 将所有fix_gamma为True的修改为1,fix_gamma为False时不需要修改。调用完成后,再利用2中的代码完成模型的转换,其推理结果就一致了。

def get_model(ctx, image_size, model_str, layer):
   _vec = model_str.split(',')
   assert len(_vec) == 2
   prefix = _vec[0]
   epoch = int(_vec[1])
   print('loading', prefix, epoch)
   sym, arg_params, aux_params = mx.model.load_checkpoint(prefix, epoch)
   reshape_params = {}
   for k, v in arg_params.items():
       if 'batchnorm_gamma' in k or 'fc1_gamma' in k:            
           v[:]=1.0
       reshape_params[k] = v
   mx.model.save_checkpoint(prefix, epoch, sym, reshape_params, aux_params)

总结

本文记录作者在转换insightface中gender_age模型时遇到的问题,如有侵权,请联系删除。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhaokai5/article/details/120171812

智能推荐

用 nssm 把 Nginx 安装成 Windows 服务方法-程序员宅基地

文章浏览阅读295次。总之:用 nssm 比srvany.exe简便多了。1. 下载nginx windows版本:http://nginx.org/2. 下载nssm :http://nssm.cc/3. 安装Nginx下载解压到一个目录,nssm下载后解压相应版本(32/64)到一个目录。然后安装服务:nssm install N1"D:\N1\nginx.exe"即可安装成功最基本的服务,不过启动的是..._nssm nigx

H5新特性-程序员宅基地

文章浏览阅读1k次,点赞40次,收藏15次。【代码】H5新特性。

python正则表达式入门视频_Python快速入门正则表达式!半个小时就够了,最详细的教程系列!...-程序员宅基地

文章浏览阅读114次。正则表达式BeautifulSoupLxmlPyQueryCSSselector好了,开始我们的解析之旅吧!先用正则语法定义一个规则(pattern)然后用这个规则与你download的网页字符串进行对比,根据pattern提取你想要的数据。好了,让我们看看Python正则表达式的语法:re模块核心函数上面简单的介绍了正则表达式的pattern是如何设置的,那么下一步我们就可以开始我们的提取工作了..._python 正则 视频

必做的高收益自媒体平台,分享给大家_自媒体哪个平台收益最高-程序员宅基地

文章浏览阅读1.1k次。现在市面上的自媒体平台是非常多的,大大小小加起来也有30好几个,但是要说到哪些平台收益比较高,那就不得不提到下面这个几个主流平台,今天就给大家分享一下收益比较高的几个主流平台。第一个:百家号百家号平台目前的收益单价在众多自媒体平台来说真的算是非常高的了,一般阅读单价可以达到20左右,当然这是最好的原创账号的收益,一般平台账号的单价也只在十多块左右。百家转正后根据不同领域的方向其收益单价也是有差异的。自媒体运营百家号平台是必须要做的,而且百家号经常有一些积分活动,积分可以兑换很多奖品。第二个:头条号头条号是唯_自媒体哪个平台收益最高

大学四年,我是怎么靠做外包私活赚了10w+,实现经济独立_大学生做外包项目多少钱-程序员宅基地

文章浏览阅读6.1k次,点赞45次,收藏107次。CSDN上的读者应该大多也是程序员或者互联网相关行业的,计算机这个专业薪资的确比一些传统工科高不少,甚至很多应届生的薪资比传统行业工作十来年的人还高,这还不在少数,至于这样的现象还能持续多久,我也不知道。但是高收入必然会吸引大量的转专业、转行的同学过来,去一个高速发展的行业享受行业发展的红利这无可厚非,去年也有几个学机械、化工的高中同学找我要学计算机的经验。毕竟一个人的命运,除了要靠自我奋斗,也要考虑历史的进程。第三次工业革命的基础就是 信息技术 + 智能制造。搭上时代的快车,这是个人成长的最快途_大学生做外包项目多少钱

C语言-表达式求值_表达式求值c语言代码-程序员宅基地

文章浏览阅读1.3k次。C语言-表达式求值_表达式求值c语言代码

随便推点

如何把SQL Server的数据库导为sql文件_sqlserver导出sql文件-程序员宅基地

文章浏览阅读7.9k次,点赞5次,收藏35次。如果要导出数据库的所有内容,则在“要编写脚本的数据的类型”后面选择“架构和数据”。默认是架构,如果没设置,那么导出来的sql文件是没有数据的。如果要全部导出则在表前面打勾,部分则在具体表前面打勾。这里最好设置一下,不然导出的文件不方便找到。到这里导出数据库为sql文件就完成了。_sqlserver导出sql文件

第14天_商城支付状态监听-程序员宅基地

文章浏览阅读197次。第14章 秒杀学习目标防止秒杀重复排队重复排队:一个人抢购商品,如果没有支付,不允许重复排队抢购并发超卖问题解决1个商品卖给多个人:1商品多订单秒杀订单支付秒杀支付:支付流程需要调整超时支付订单库存回滚1.RabbitMQ延时队列2.利用延时队列实现支付订单的监听,根据订单支付状况进行订单数据库回滚1 防止秒杀重复排队用户每次抢单的时候,一旦排队,我们设置一个自增值,让该值的初始值为1,每次进入抢单的时候,对它进行递增,如果值>1,则表明已经排队,不_商城支付状态监听

让Google-Gmail 能够自动化发送邮件_使用谷歌邮箱自动化发邮件-程序员宅基地

文章浏览阅读2.6k次。Google的GMAIL相信大家都知道,基本上人人拥有,它以简约的风格和方便的操作赢得了许多专业人士的好评,这两天没事自己用IE自动化模型以及HTML DOM写了一个自动化GMAIL的VBScript脚本。必要条件:因为是VBS,所有电脑都支持,不需要安装任何工具 需要有Gmail帐号和密码 脚本如下:'**********************定义变量*_使用谷歌邮箱自动化发邮件

用XAMPP搭建PHP服务器,配置部署多个项目的过程(附blocked port error解决方法)_xampp的phperror-程序员宅基地

文章浏览阅读1k次,点赞23次,收藏23次。安装完成XAMPP后,浏览器输入localhost或127.0.0.1,若远程服务器,替换对应IP地址即可。因浏览网页服务默认的port都是80,因此只需输入网址即可,不用输入“:80”了,​​XAMPP默认指向的文件地址是安装目录下的htdocs文件夹。_xampp的phperror

基于 golang, grpc, gin 和 redis, kafka, MySQL, etcd 和 vue3 的简单分布式信息管理系统-程序员宅基地

文章浏览阅读873次,点赞11次,收藏14次。基于 golang, grpc, gin 和 redis, kafka, MySQL, etcd 和 vue3 的简单分布式信息管理系统含完整前后端,微服务:分布式信息管理系统模板,后台管理系统模板,数据库管理系统模板。实现 grpc 微服务远程过程调用,redis 缓存,etcd 服务发现,负载均衡。令牌签验,非对称加密。通过 Web 应用完成对数据库的增删改查(CRUD),文件流的上传和下载。前后端分离

app inventor入门详细教程(音乐播放器)01-程序员宅基地

文章浏览阅读1.6w次,点赞22次,收藏189次。App inventor 介绍简介App Inventor是由Google公司开发的一款在线开放的Android编程工具软件,通过图形化积木式的拖放组件来完成Apps开发App Inventor在2012年1月移交给麻省理工学院MIT的行动学习中心,并由MIT发布使用,目前已经发布了第2版本特点开发环境搭建简单。采用浏览器+云服务模式,无需复杂软件安装开发过程简单。手机App的界面设计和行为开发都可以通过可视化的拖放拼接组件来完成,无需关注复杂的语法规则组件模块丰富。App Invent_app inventor

推荐文章

热门文章

相关标签