我有.data, .index和.meta文件,我能够从TensorFlow脚本中创建saved_model.pb和一个变量持有者。
当我运行以下命令时,
tflite_convert --output_file='/home/tensor/Work/cr/saved.tflite' --saved_model_dir='/home/tensor/Work/cr/model_out'
它给我报错
ValueError: No 'serving_default' in the SavedModel's SignatureDefs. Possible values are ''.
我想将这个.pb文件转换为.tflite。请问有人能告诉我如何解决这个错误吗?
回答:
你需要一个“推理图”来转换为TFLite。
为此,你需要导出一个所有变量都转换为常量的图(因为TFLite不会进行任何训练)。转换的说明在这里,具体是这段代码:
import os, argparseimport tensorflow as tf# The original freeze_graph function# from tensorflow.python.tools.freeze_graph import freeze_graph dir = os.path.dirname(os.path.realpath(__file__))def freeze_graph(model_dir, output_node_names): """提取由输出节点定义的子图,并将其所有变量转换为常量 参数: model_dir: 包含检查点状态文件的根文件夹 output_node_names: 一个字符串,包含所有输出节点的名称,以逗号分隔 """ if not tf.gfile.Exists(model_dir): raise AssertionError( "导出目录不存在。请指定一个导出目录:%s" % model_dir) if not output_node_names: print("你需要提供一个节点名称给--output_node_names。") return -1 # 我们检索我们的检查点完整路径 checkpoint = tf.train.get_checkpoint_state(model_dir) input_checkpoint = checkpoint.model_checkpoint_path # 我们指定我们冻结图的文件完整名称 absolute_model_dir = "/".join(input_checkpoint.split('/')[:-1]) output_graph = absolute_model_dir + "/frozen_model.pb" # 我们清除设备以允许TensorFlow控制它将在哪个设备上加载操作 clear_devices = True # 我们使用一个临时的新图启动一个会话 with tf.Session(graph=tf.Graph()) as sess: # 我们将元图导入当前默认图中 saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=clear_devices) # 我们恢复权重 saver.restore(sess, input_checkpoint) # 我们使用内置的TF助手将变量导出为常量 output_graph_def = tf.graph_util.convert_variables_to_constants( sess, # 会话用于检索权重 tf.get_default_graph().as_graph_def(), # 图定义用于检索节点 output_node_names.split(",") # 输出节点名称用于选择有用的节点 ) # 最后我们序列化并将输出图转储到文件系统 with tf.gfile.GFile(output_graph, "wb") as f: f.write(output_graph_def.SerializeToString()) print("%d ops in the final graph." % len(output_graph_def.node)) return output_graph_def