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