TensorFlow冻结图为字节文件用于Unity时遇类型错误求助
解决TensorFlow冻结计算图时的TypeError问题
这个错误其实很好定位——问题出在你传入names_to_saveables的对象里混进了张量(Tensor),但这个参数要求的必须是**变量(Variable)**或者符合可保存格式的对象。你提到的BoxPredictor_0/BoxEncodingPredictor/biases:0就是一个张量,不是变量,所以才触发了这个报错。
下面给你几个针对性的解决方案:
确认要保存的是变量而非张量
先检查模型中的可训练变量列表,看看目标偏置是否是变量类型:# 列出所有可训练变量 trainable_vars = tf.trainable_variables() for var in trainable_vars: print(var.name)如果列表里存在
BoxPredictor_0/BoxEncodingPredictor/biases:0(或者去掉:0的名称),直接用这个变量对象构建names_to_saveables字典,而不是通过get_tensor_by_name去获取张量:names_to_saveables = {var.name.split(':')[0]: var for var in trainable_vars}将张量转换为变量(如果确实需要保存这个张量)
如果这个偏置是通过运算或者常量生成的张量,你可以把它包装成变量:# 获取目标张量 bias_tensor = tf.get_default_graph().get_tensor_by_name('BoxPredictor_0/BoxEncodingPredictor/biases:0') # 转换为变量 bias_var = tf.Variable(bias_tensor, name='BoxEncodingPredictor_biases') # 在会话中初始化这个变量 with tf.Session() as sess: sess.run(bias_var.initializer) # 把这个变量加入到保存字典中 names_to_saveables = {'BoxEncodingPredictor_biases': bias_var} # 后续执行冻结/保存操作推荐使用官方冻结工具(更适合Unity场景)
如果你是为了在Unity中使用模型,更简单的方式是用TensorFlow官方的freeze_graph.py工具,它会自动把变量转换为常量张量,不需要手动处理names_to_saveables:- 先保存模型的checkpoint和图结构:
with tf.Session() as sess: # 假设已经完成模型初始化/训练 saver = tf.train.Saver() saver.save(sess, './my_model.ckpt') tf.train.write_graph(sess.graph_def, './', 'my_model.pbtxt') - 运行冻结脚本(可从TensorFlow源码中获取该脚本):
python freeze_graph.py \ --input_graph=./my_model.pbtxt \ --input_checkpoint=./my_model.ckpt \ --output_graph=./frozen_model.pb \ --output_node_names="你的输出节点名称"
生成的
frozen_model.pb就可以直接导入Unity的TensorFlow插件中使用了。- 先保存模型的checkpoint和图结构:
内容的提问来源于stack exchange,提问作者matthew hallberg
相关产品推荐
相关产品推荐

