mmdnn实现模型转换

一、mxnet转tensorflow模型

1.下载mmdnn源码或pip安装,切换到mmdnn主目录下;安装时需要安装numpy+mkl的最新版本,准备好 mxnet模型的 .json文件和.params文件。


2.运行命令行:

python -m mmdnn.conversion._script.convertToIR -f mxnet -n model-symbol.json -w model-0000.params -d resnet50 --inputShape  3,112,112
会生成 resnet50.json(可视化文件) resnet50.npy(权重参数) resnet50.pb(网络结构) 三个文件。

3. 运行命令行:
python -m mmdnn.conversion._script.IRToCode -f tensorflow --IRModelPath resnet50.pb --IRWeightPath resnet50.npy --dstModelPath  tf_resnet50.py
生成tf_resnet50.py文件,可以调用tf_resnet50.py中的KitModel函数加载npy权重参数重新生成原网络框架。

4.基于esnet50.npy和tf_resnet50.py文件,固化参数,生成PB文件:

import tensorflow as tf
import tf_resnet50 as tf_fun
def netWork():
    model=tf_fun.KitModel("./resnet50.npy")
    return model
def freeze_graph(output_graph):
    output_node_names = "output"
    data,fc1=netWork()
    fc1=tf.identity(fc1,name="output")

    graph = tf.get_default_graph()  # 获得默认的图
    input_graph_def = graph.as_graph_def()  # 返回一个序列化的图代表当前的图
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init)
        output_graph_def = tf.graph_util.convert_variables_to_constants(  # 模型持久化,将变量值固定
            sess=sess,
            input_graph_def=input_graph_def,  # 等于:sess.graph_def
            output_node_names=output_node_names.split(","))  # 如果有多个输出节点,以逗号隔开

        with tf.gfile.GFile(output_graph, "wb") as f:  # 保存模型
            f.write(output_graph_def.SerializeToString())  # 序列化输出

if __name__ == '__main__':
    freeze_graph("frozen_tf12.pb")
    print("finish!")

5. 采用tensorflow的post-train quantization离线量化方法(有一定的精度损失)转换成tflite模型,从而完成端侧的模型部署:

import tensorflow as tf

convert=tf.lite.TFLiteConverter.from_frozen_graph("frozen_tf12.pb",input_arrays=["data"],output_arrays=["output"],
                                                  input_shapes={"data":[1,112,112,3]})
convert.post_training_quantize=True
tflite_model=convert.convert()
open("quantized_model.tflite","wb").write(tflite_model)
print("finish!")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章