Mxnet转Onnx 踩坑记录

0. 前言

使用将MXNET模型转换为ONNX的过程中有很多算子不兼容,在此对那些不兼容的算子替换。在此之前需要安装mxnet分支v1.x版本作为mx2onnx的工具,git地址如下:

mxnet/python/mxnet/onnx at v1.x · apache/mxnet · GitHub

同时还参考了如下的两个知乎链接:

https://zhuanlan.zhihu.com/p/166267806

https://zhuanlan.zhihu.com/p/165294876

1. UpSample

1.1 采用Resize实现

mxnet/contrib/onnx/mx2onnx/_op_translations.py
def create_helper_tensor_node(input_vals, output_name, kwargs):"""create extra tensor node from numpy values"""data_type = onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[input_vals.dtype]tensor_node = onnx.helper.make_tensor_value_info(name=output_name,elem_type=data_type,shape=input_vals.shape)kwargs["initializer"].append(onnx.helper.make_tensor(name=output_name,data_type=data_type,dims=input_vals.shape,vals=input_vals.flatten().tolist(),raw=False,))return tensor_node@mx_op.register("UpSampling")def convert_upsample(node, **kwargs):"""Map MXNet's UpSampling operator attributes to onnx's Upsample operatorand return the created node."""name, input_nodes, attrs = get_inputs(node, kwargs)sample_type = attrs.get('sample_type', 'nearest')sample_type = 'linear' if sample_type == 'bilinear' else sample_typescale = convert_string_to_list(attrs.get('scale'))scaleh = scalew = float(scale[0])if len(scale) > 1:scaleh = float(scale[0])scalew = float(scale[1])scale = np.array([1.0, 1.0, scaleh, scalew], dtype=np.float32)roi = np.array([], dtype=np.float32)node_roi=create_helper_tensor_node(roi, name+'roi', kwargs)node_sca=create_helper_tensor_node(scale, name+'scale', kwargs)node = onnx.helper.make_node('Resize',inputs=[input_nodes[0], name+'roi', name+'scale'],outputs=[name],coordinate_transformation_mode='asymmetric',mode=sample_type,nearest_mode='floor',name=name)return [node_roi, node_sca, node]

1.2 采用ConvTranspose实现

@mx_op.register("UpSampling")def convert_upsample(node, **kwargs):"""Map MXNet's UpSampling operator attributes to onnx's Upsample operatorand return the created node."""import mathname, inputs, attrs = get_inputs(node, kwargs)#==NearestNeighbor ==channels=64  #此处需要手动修改!!!scale=int(attrs.get('scale'))pad=math.floor((scale - 1)/2.0)weight = np.ones((channels,1,scale,scale), dtype=np.float32)weight_node=create_helper_tensor_node(weight, name+'_weight', kwargs)pad_dims = [pad, pad]pad_dims = pad_dims + pad_dims#print(pad_dims)deconv_node = onnx.helper.make_node("ConvTranspose",inputs=[inputs[0], name+'_weight'],outputs=[name],auto_pad="VALID",strides=[scale, scale],kernel_shape=[scale,scale],pads=pad_dims,group=channels,name=name)return [deconv_node]

2. 使用Slice代替Crop.

mxnet/contrib/onnx/mx2onnx/_op_translations.pydef create_helper_shape_node(input_node, node_name):"""create extra transpose node for dot operator"""trans_node = onnx.helper.make_node('Shape',inputs=[input_node],outputs=[node_name],name=node_name)return trans_node@mx_op.register("Crop")def convert_crop(node, **kwargs):"""Map MXNet's crop operator attributes to onnx's Crop operatorand return the created node."""name, inputs, attrs = get_inputs(node, kwargs)start=np.array([0, 0, 0, 0], dtype=np.int) #index是int类型start_node=create_helper_tensor_node(start, name+'__starts', kwargs)shape_node = create_helper_shape_node(inputs[1], inputs[1]+'__shape')crop_node = onnx.helper.make_node("Slice",inputs=[inputs[0], name+'__starts', inputs[1]+'__shape'], #data、start、endoutputs=[name],name=name)logging.warning("Using an experimental ONNX operator: Crop. " \"Its definition can change.")return [start_node, shape_node, crop_node]

3. ONNX softmax维度转换问题

onnx的实现的softmax在处理多维输入(NCHW)存在问题。

@mx_op.register("softmax")def convert_softmax(node, **kwargs):"""Map MXNet's softmax operator attributes to onnx's Softmax operatorand return the created node."""name, input_nodes, attrs = get_inputs(node, kwargs)axis = int(attrs.get("axis", -1))c_softmax_node = []axis=-1transpose_node1 = onnx.helper.make_node("Transpose",inputs=input_nodes,perm=(0,2,3,1), #NCHW--NHWC--(NHW,C)name=name+'_tr1',outputs=[name+'_tr1'])softmax_node = onnx.helper.make_node("Softmax",inputs=[name+'_tr1'],axis=axis,name=name+'',outputs=[name+''])transpose_node2 = onnx.helper.make_node("Transpose",inputs=[name+''],perm=(0,3,1,2), #NHWC--NCHWname=name+'_tr2',outputs=[name+'_tr2'])c_softmax_node.append(transpose_node1)c_softmax_node.append(softmax_node)c_softmax_node.append(transpose_node2)return c_softmax_node

https://pic4.zhimg.com/80/v2-749aceeb26827b81603c3862f010cafb_720w.jpg

4. MaxPool 一致性对应不上问题,ceil设置

5. AvgPool  count_include_pad问题

AvgPool一致性对不上的时候,查看参数设置是否正确

6. AdaptiveAvgPooling2D 不支持

将AdaptiveAvgPooling2D 固定尺寸,转换为AvgPooling2D

7. onnx check错误,说明有些算子check不通过(mxnet自带的bug),安装mx2onnx v1.x重新再转一次

8. SoftmaxActivation

在mxnet中,SoftmaxActivation表明This operator has been deprecated.

https://pic1.zhimg.com/80/v2-4139577e2b687590c488ed114023eb20_720w.jpg

解决办法:手动修改SoftmaxActivation的op为softmax,axis=1对应channel。

9. FullConnect 全连接层转换不兼容

       

使用最新版本的mxnet 转,不要用mx2onnx v1.x里的注册函数

10. L2Normalization不支持instance模式

解决方法:无解,只有将L2Normal放到外面做

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

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

相关文章

【postgresql】 基础知识学习

PostgreSQL是一个高度可扩展的开源对象关系型数据库管理系统(ORDBMS),它以其强大的功能、灵活性和可靠性而闻名。 官网地址:https://www.postgresql.org/ 中文社区:文档目录/Document Index: 世界上功能最强大的开源…

数据结构1:C++实现边长数组

数组作为线性表的一种,具有内存连续这一特点,可以通过下标访问元素,并且下标访问的时间复杂的是O(1),在数组的末尾插入和删除元素的时间复杂度同样是O(1),我们使用C实现一个简单的边长数组。 数据结构定义 class Arr…

web零碎知识2

不知道我的这个axios的包导进去没。 找一下关键词: http请求协议:就是进行交互式的格式 需要定义好 这个式一发一收短连接 而且没有记忆 这个分为三个部分 第一个式请求行,第二个就是请求头 第三个就是请求体 以get方式进行请求的失手请求…

Vatee万腾平台:智慧生活的无限可能

在科技日新月异的今天,我们的生活正被各种智能技术悄然改变。从智能家居到智慧城市,从个人健康管理到企业数字化转型,科技的力量正以前所未有的速度渗透到我们生活的每一个角落。而在这场智能革命的浪潮中,Vatee万腾平台以其卓越的…

Swagger php注解常用语法梳理

Swagger php注解常用语法梳理 快速编写你的 RESTFUL API 接口文档工具,通过注释定义接口和模型,可以和代码文件放置一起,也可以单独文件存放。 Swagger 优势 通过代码注解定义文档,更容易保持代码文档的一致性模型复用&#xff0…

C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例

C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例 文章目录 C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例1、概述2、实现效果3、主要代码4、源码地址 更多精彩内容👉个人内容分类汇总 👈👉GIS开发 👈 1、概述 支持多线程加…

【十三】图解 Spring 核心数据结构:BeanDefinition 其二

图解 Spring 核心数据结构:BeanDefinition 其二 概述 前面写过一篇相关文章作为开篇介绍了一下BeanDefinition,本篇将深入细节来向读者展示BeanDefinition的设计,让我们一起来揭开日常开发中使用的bean的神秘面纱,深入细节透彻理解…

第9章 项目总结01:项目流程,每个模块的介绍

1 请介绍一下你的项目 学成在线项目是一个B2B2C的在线教育平台,本项目包括了用户端、机构端、运营端。 核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。 下图是项目的功能模块图: 项目采用前后端分离的技…

去除gif动图背景的工具网站

选择视频或GIF - 取消屏幕 (unscreen.com)https://www.unscreen.com/upload

24-7-6-读书笔记(八)-《蒙田随笔集》[法]蒙田 [译]潘丽珍

文章目录 《蒙田随笔集》阅读笔记记录总结 《蒙田随笔集》 《蒙田随笔集》蒙田(1533-1592),是个大神人,这本书就是250页的样子,但是却看了好长好长时间,体会还是挺深的,但看的也是不大仔细&…

【TORCH】绘制权重分布直方图,权重torch.fmod对torch.normal生成的随机数进行取模运算

要绘制上述代码中权重初始化的分布,可以分别展示每一层初始化权重的直方图。我们将用 torch.fmod 对 torch.normal 生成的随机数进行取模运算,确保权重值在 -2 到 2 之间。 含义解释 torch.normal(0, init_sd, size...):生成服从均值为 0、…

以黑盒与白盒的角度分析和通关xss-labs(XSS漏洞类型与总结)

目录 目录 前言 XSS漏洞的总结和梳理 1.第一关(基础palyload) 黑盒测试 白盒测试 2.第二关(闭合) 黑盒测试 白盒测试 3.第三关(字符转义) 黑盒测试 白盒测试 4.第四关(字符过滤或替换) 黑盒测试 白盒测试 5.第五关(关键词替换) 黑盒测试 白盒测试 6.第六关(…

el-table实现固定列,及解决固定列导致部分滚动条无法拖动的问题

一、el-table实现固定列 当数据量动态变化时&#xff0c;可以为 Table 设置一个最大高度。 通过设置max-height属性为 Table 指定最大高度。此时若表格所需的高度大于最大高度&#xff0c;则会显示一个滚动条。 <div class"zn-filter-table"><!-- 表格--…

AI对于高考和IT行业的深远影响

目录 AI对IT行业的冲击及深远影响1. 工作自动化2. 新的就业机会3. 行业融合4. 技术升级和创新5. 数据的重要性 IT行业的冬天要持续多久&#xff1f;大学的软件开发类专业是否还值得报考&#xff1f;其他问题IT行业是否都是加班严重&#xff1f;35岁后就业困难是否普遍现象&…

基于TCP的在线词典系统(分阶段实现)

1.功能说明 一共四个功能&#xff1a; 注册 登录 查询单词 查询历史记录 单词和解释保存在文件中&#xff0c;单词和解释只占一行, 一行最多300个字节&#xff0c;单词和解释之间至少有一个空格。 2.功能演示 3、分阶段完成各个功能 3.1 完成服务器和客户端的连接 servic…

springcloud-alibba之FeignClient

代码地址&#xff1a;springcloud系列: springcloud 组件分析拆解 1.FeignClient的集成 springboot版本&#xff1a;3.1.5 springcloud组件版本&#xff1a;2022.0.4 nacos客户端的版本&#xff1a;2.3.2 1.引pom 这里引入了nacos和feginclient的版本 <dependency>…

【MySQL】事务四大特性以及实现原理

事务四大特性 原子性&#xff08;Atomicity&#xff09; 事务中的所有操作要么全部完成&#xff0c;要么全部不执行。如果事务中的任何一步失败&#xff0c;整个事务都会被回滚&#xff0c;以保持数据的完整性。 一致性&#xff08;Consistency&#xff09; 事务应确保数据库…

机器学习——决策树及其可视化

1、决策树概念 顾名思义&#xff0c;决策树是利用数据结构中树结构来进行判断&#xff0c;每一个结点相当于一个判断条件&#xff0c;叶子结点即是最终的类别。以鸢尾花为例&#xff0c;可以得到如下的决策树&#xff1a; 2、决策树分类的依据是什么&#xff1f; 根据前面分…

跨越语言的界限:Vue I18n 国际化指南

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 国际化简介 vue-i18n 安装和配置 创建语言包 基本使用 切换语言 动态翻…

CTFShow的RE题(二)

逆向5 附件无后缀&#xff0c;查一下是zip&#xff0c;解压得到一个exe一个dll文件。 往下继续看 但也根进去看看 发现是在加载的dll文件 还有一个返回时调用的函数 发现是打印函数 根据以往的经验应该是要跳转到这里&#xff0c;动调一下。 发现exe链接了dll&#xff0c;…