最近因为工作上需要将Mxnet模型文件转为tensorflow使用的PB文件,特地研究了下。多数思路是先将Mxnet模型转为caffe模型,然后再转为tensorflow模型,但这些方法比较小众,通用性不强,转换过程出错概率很高。
今年年初,微软开源了MMdnn,这是一套用于转换、可视化深度神经网络模型的综合性解决方案。MMdnn中的「MM」代表模型管理,「dnn」的意思是深度神经网络,它能够通过中间表征格式让训练模型在Caffe、Keras、MXNet、Tensorflow、CNTK、PyTorch和CoreML等深度学习框架之间转换,帮助开发者实现模型在不同框架之间的交互。
支持框架如下图:
本文记录转换过程:
mmdnn:0.2.5
tensorflow:1.13
mxnet:1.2.0
step1:convert the model to intermediate representation format.
命令:
python3 -m mmdnn.conversion._script.convertToIR -f mxnet -n model-symbol.json -w model-0000.params -d resnet100 --inputShape 3,112,112
此过程生成文件列表:
IR network structure is saved as [resnet100.json].
IR network structure is saved as [resnet100.pb].
IR weights are saved as [resnet100.npy].
Step2:convert to tensorflow code
命令:
python3 -m mmdnn.conversion._script.IRToCode -f tensorflow --IRModelPath resnet100.pb --IRWeightPath resnet100.npy --dstModelPath tf_resnet100.py
或者
mmtocode -f tensorflow --IRModelPath resnet100.pb --IRWeightPath resnet100.npy --dstModelPath tf_resnet100.py
生成文件如下:
tf_resnet100.py
Step3:convert to tensorflow file
命令:
mmtomodel -f tensorflow -in tf_resnet100.py -iw resnet100.npy -o tf_resnet1001 --dump_tag SERVING
或者
mmtomodel -f tensorflow -in tf_resnet100.py -iw resnet100.npy -o tf_resnet100_train1 --dump_tag TRAINING
生成配置的-o路径,里面包含了pb文件。
Step4:frozen pb model file
此步骤根据需要,如果要生成固化模型,可以使用freeze_graph.py固化。
Step5:模型使用
这一步发挥空间较大,可以使用Step1生成的文件,可以使用Step3生成的pb,也可以使用Step4生成的pb文件。
但是模型输出跟原始的mxnet模型不一样,差别较大,需要进行转换后使用,精度有少许下降。