You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:53:32