TensorFlow导出LSTM模型报错求助:freeze_graph调用异常
TensorFlow导出LSTM模型到Android时freeze_graph报错排查
我在导出用于Android的LSTM模型时,执行freeze_graph.freeze_graph代码行时报错,代码如下:
freeze_graph.freeze_graph(path+'models/'+model_name+'_graph.pbtxt',None,False,path+'models/har_model.chkp-1',output_node_name,path+'save/restore_all',path+'save/Const:0',path+'models/frozen_'+model_name+'.pb',True,"")
已完成的前置代码:
from keras import backend as K from tensorflow.python.tools import freeze_graph import tensorflow as tf input_node_name = ['lstm_1_input'] output_node_name = 'output/Softmax' model_name = 'har_model' graph_def_txt_path = path+'models/' + model_name + '_graph.pbtxt' sess = tf.compat.v1.Session() tf.io.write_graph(sess.graph_def, path+'models', model_name+'_graph.pbtxt') checkpoint_path = path+'models/' + model_name + '.chkp' # Adjust the path for Colab checkpoint = tf.train.Checkpoint() checkpoint.save(file_prefix=checkpoint_path) frozen_graph_path = path+'models/frozen_' + model_name + '.pb' tf.io.write_graph(sess.graph_def, path+'models', graph_def_txt_path)
报错原因排查及解决方案
1. 空Checkpoint导致无法恢复变量
你用tf.train.Checkpoint()创建的检查点没有绑定任何模型变量,相当于保存了一个空的检查点,freeze_graph找不到需要恢复的参数,必然报错。正确做法是将模型变量与Checkpoint绑定:
# 先将Keras模型关联到当前session K.set_session(sess) # 加载已训练好的权重(如果有) model.load_weights("你的权重文件路径") # 将模型变量绑定到Checkpoint checkpoint = tf.train.Checkpoint(model=model) # 或者直接绑定所有可训练变量 # checkpoint = tf.train.Checkpoint(**{v.name: v for v in tf.trainable_variables()}) checkpoint.save(file_prefix=checkpoint_path)
2. 计算图文件为空,参数配置错误
- 空计算图问题:你在创建session后直接写入
graph_def,此时计算图中没有LSTM模型的结构,freeze_graph找不到指定的节点。需要先构建/加载模型,再写入计算图:# 先定义或加载你的LSTM模型 model = 你的LSTM模型定义代码 K.set_session(sess) model.compile(optimizer='adam', loss='categorical_crossentropy') # 训练或加载权重后,再写入计算图 tf.io.write_graph(sess.graph_def, path+'models', model_name+'_graph.pbtxt', as_text=True) - 参数配置错误:
restore_op_name和filename_tensor_name参数是用于自定义恢复操作的,你没有生成对应的节点,应该设为空字符串,而非指定路径。
修正后的freeze_graph调用:
freeze_graph.freeze_graph( input_graph=path+'models/'+model_name+'_graph.pbtxt', input_saver="", input_binary=False, input_checkpoint=path+'models/har_model.chkp-1', output_node_names=output_node_name, restore_op_name="", filename_tensor_name="", output_graph=path+'models/frozen_'+model_name+'.pb', clear_devices=True, initializer_nodes="" )
3. 更简便的替代方案:使用SavedModel格式
TensorFlow推荐用SavedModel格式导出模型,更适配跨平台部署(包括Android),步骤更简洁:
# 假设你的Keras模型是model tf.saved_model.save(model, path+'saved_model') # 直接转换为Android可用的TFLite格式 converter = tf.lite.TFLiteConverter.from_saved_model(path+'saved_model') tflite_model = converter.convert() with open(path+'har_model.tflite', 'wb') as f: f.write(tflite_model)
内容的提问来源于stack exchange,提问作者Hasan Seam
相关产品推荐
相关产品推荐

