利用MMdnn对比keras和mxnet
关键字 MMdnn,keras,mxnet,resnet50
需求:想测试一下keras下model转到MXNet框架下对于同一张图片各中间层输出结果有什么差异。
一. 前期准备
1. 依赖库的选择
由于各个库之间的依赖关系是存在限制关系的,最新的版本未必是最合适的,因此通过比较,最终确定的各个依赖库版本如下:
Python 3.5
Anaconda 4.2.0
Tensorflow 1.13.1
Mxnet 1.4.0
Mmdnn 0.2.4
Numpy 1.16.2
但是 mxnet 1.4.0.post0 要求numpy的版本<1.15.0,>=1.8.2,理论上来说是会出问题的,但是使用的时候没有报错。
2. 预训练模型的下载
使用resnet50为测试模型,按照MMdnn文档的指示,下载resnet50的预训练模型只需要如下命令:
mmdownload -f keras -n resnet50
二. 正式开始
将keras模型转化为Mxnet模型,官方提供了两种方法,为了对比keras和Mxnet便于调试,使用Step by Step方式,其步骤如下。
Step 1
mmtoir -f keras -w imagenet_resnet50.h5 -o converted
IR network structure is saved as [converted.json].
IR network structure is saved as [converted.pb].
IR weights are saved as [converted.npy].
Then you got the intermediate representation files converted.json for visualization, converted.pb and converted.npy for next steps.
Step 2
mmtocode -f mxnet -d converted_resnet50_mxnet.py -n converted.pb -w converted.npy -dw mxnet_converted-0000.param
And you will get a file named converted_resnet50_mxnet.py, which contains the mxnet codes to build the resnet50 network, the file named mxnet_converted-0000.param contains the parameters to build the network.
通过上述两个步骤即可得到keras到mxnet的resnet50的转换代码。
三. 框架对比
为了输出两种框架的中间结果,需要对代码进行处理(以最后一层为例)。
1. Keras
layer_model = Model(inputs=model.input, outputs=model.layers[-1].output)
其中-1表示的是resnet50最后一层输出的结果
features_keras =layer_model.predict(x_keras)
features_keras最后的数据就是最后的结果
2. Mxnet
fc1000_activation = mx.sym.SoftmaxOutput(data = fc1000, name = 'softmax') group = mx.symbol.Group([fc1000_activation]) model = mx.mod.Module(symbol = group, context = mx.cpu(), data_names = ['input_1']) model.forward(Batch([mx.nd.array(img)])) features_mxnet = model.get_outputs()[0] features_mxnet = features_mxnet.asnumpy()
features_keras最后的数据就是最后的结果
四. 结论
在预处理相同操作的情况下,比较了很多层基本上都是相同的,以最后一层为例,其误差量级是e-13左右,差值的方差是e-17左右。

参考:
[1]. https://github.com/Microsoft/MMdnn
[2]. https://github.com/Microsoft/MMdnn/blob/master/docs/keras2cntk.md
[3]. https://blog.csdn.net/u010414386/article/details/55668880
利用MMdnn对比keras和mxnet的更多相关文章
- 常用深度学习框——Caffe/ TensorFlow / Keras/ PyTorch/MXNet
常用深度学习框--Caffe/ TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tenso ...
- MxNet+R︱用R语言实现深度学习(单CPU/API接口,一)
MxNet有了亚马逊站台之后,声势大涨,加之接口多样化,又支持R语言所以一定要学一下.而且作为R语言的fans,为啥咱们R语言就不能上深度学习嘞~ -------------------------- ...
- Tensorflow1.4 高级接口使用(estimator, data, keras, layers)
TensorFlow 高级接口使用简介(estimator, keras, data, experiment) TensorFlow 1.4正式添加了keras和data作为其核心代码(从contri ...
- Keras:
https://keras.io/zh/layers/core/ keras使用稀疏输入进行训练 2018.06.14 12:55:46字数 902阅读 760 稀疏矩阵 稀疏矩阵是指矩阵中数值为0的 ...
- ML平台_微博深度学习平台架构和实践
( 转载至: http://www.36dsj.com/archives/98977) 随着人工神经网络算法的成熟.GPU计算能力的提升,深度学习在众多领域都取得了重大突破.本文介绍了微博引入深度学 ...
- 深度学习常用数据集 API(包括 Fashion MNIST)
基准数据集 深度学习中经常会使用一些基准数据集进行一些测试.其中 MNIST, Cifar 10, cifar100, Fashion-MNIST 数据集常常被人们拿来当作练手的数据集.为了方便,诸如 ...
- Speech Enhancement via Deep Spectrum Image Translation Network
文中提出了一种深度网络来解决单通道语音增强问题. 链接:https://arxiv.org/abs/1911.01902 简介 因为背景噪声和混响的存在,录音通常会被扭曲,会对后端的语音识别等技术产生 ...
- Tensorflow 介绍和安装
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:AI小昕 本系列教程将手把手带您从零开始学习Tensorfl ...
- Deep Learning部署TVM Golang运行时Runtime
Deep Learning部署TVM Golang运行时Runtime 介绍 TVM是一个开放式深度学习编译器堆栈,用于编译从不同框架到CPU,GPU或专用加速器的各种深度学习模型.TVM支持来自Te ...
随机推荐
- ZOJ 3949 Edge to the Root( 树形dp)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3949 题解:树dp真的很直觉,或者说dp真的很直觉.就上周末比赛时其实前一 ...
- (转)Java回收对象的标记 和 对象的二次标记过程
Java回收对象的标记 和 对象的二次标记过程 二次标记 针对这个问题,虚拟机的做法是进行两次标记,即第一次标记不在“关系网”中的对象.第二次的话就要先判断该对象有没有实现finalize()方法了, ...
- Python之file
读写文件 代码: #读写文件str = """i love China!!i hope everyone save"""#打开并书写文件f ...
- (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree
Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longe ...
- HDU - 3035 War(对偶图求最小割+最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3035 题意 给个图,求把s和t分开的最小割. 分析 实际顶点和边非常多,不能用最大流来求解.这道题要用 ...
- Java SE之[静态成员/类成员]与[非静态成员/实例成员]【static】
定义 静态成员:又称类成员,使用static修饰符的方法和变量: 非静态成员:又称实例成员,未使用static修饰符的方法和变量. 结论 注:jdk1.8 测试源码 public class Main ...
- 使用以太网通信方式刷新AB PLC固件
本文详细介绍如何使用以太网通信方式刷新AB PLC固件 一.准备工作 1. AB PLC控制器一台,本文以5069-L330ER为例,将其通电: 2. 5069-L330ER的IP已设置为172. ...
- HttpUtility.UrlEncode()关于空格的编码问题
因为 HttpUtility.UrlEncode 在 Encode 的时候, 将空格转换成加号"+", 在 Decode 的时候将"+"号转为空格, 但是浏览器 ...
- Python:正则表达式(一):search()、match()、findall() 的区别
以前一直觉得正则很难,不会用,今天试验了几个方法,整理总结了一下,简洁明了. 简单来讲,正则就是 提取一段特征数据,用(.*?)代替. 自己总结的特点&区别: (.*) 贪婪匹配,会尽可能的往 ...
- KVO实现原理
KVO意为键值观察Key-Value-Observer,本质仍然是观察者模式. 观察者模式的定义:一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象.这个主动通知通常是 ...