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!")

 

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