ValueError: SavedModel的SignatureDefs中没有’serving_default’。可能的值是”

我有.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

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注