通过C API访问tensorflow 2.0 SavedModel的输入和输出张量

问题描述 投票:2回答:1

我无法从tensorflow 2.0 SavedModel加载C_API来运行推理,因为我无法按名称访问输入和输出操作。

我成功通过TF_LoadSessionFromSavedModel(...)加载了会话:

#include <tensorflow/c/c_api>

...

TF_Status* status = TF_NewStatus();
TF_Graph*  graph  = TF_NewGraph();
TF_Buffer* r_opts = TF_NewBufferFromString("",0);
TF_Buffer* meta_g = TF_NewBuffer();

TF_SessionOptions* opts = TF_NewSessionOptions();
const char* tags[] = {"serve"};

TF_Session* session = TF_LoadSessionFromSavedModel(opts, r_opts, "saved_model/tf2_model", tags, 1, graph, meta_g, status);

if ( TF_GetCode(status) != TF_OK ) exit(-1); //does not happen

但是,尝试使用以下命令设置输入和输出张量时出现错误:

TF_Operation* inputOp  = TF_GraphOperationByName(graph, "input"); //works with "serving_default_input"
TF_Operation* outputOp = TF_GraphOperationByName(graph, "prediction"); //does not work

我作为参数传递的名称被分配给已保存模型的输入和输出keras层,但不在已加载的graph中。运行saved_model_cli(遵循tf SavedModel教程here之后)显示,具有这些名称的男高音存在于SignatureDef serving_default下,因此我想我需要将serving_default实例化为图形(换句话说,创建根据签名的图表),但是我找不到使用C API做到这一点的方法。

请注意,tensorflows的C_API test使用C ++ tensorflow / core /功能从元图中加载签名定义图,并使用它来查找输入和输出操作名称,但我想避免对C ++的依赖。

还请注意,按名称访问操作适用于冻结的.pb图,但是不建议使用此格式。

提前感谢您的任何想法和提示!

c tensorflow tensorflow-serving tensorflow2.0 c-api
1个回答
0
投票

当前(截至2020年5月),Tensorflow C API尚未正式支持SavedModel(tensorflow 2.0)格式,即使它们可能会发布功能soon

无论如何,可以在导出模型时使用默认 SignatureDefs,并使用saved_model_cli工具查找输入和输出张量的名称。

说您使用]保存了模型>

model.save('/path/to/model/folder')

然后您打开bash并执行

cd /python/folder/bin/
saved_model_cli show --dir /path/to/model/folder --tag_set serve --signature_def serving_default

saved_model_cli的实际位置有所不同,但是在bin /文件夹上使用anaconda时默认安装了它

默认情况下它会产生类似:

serving_default
The given SavedModel SignatureDef contains the following input(s):
  inputs['graph_input'] tensor_info:
      dtype: DT_DOUBLE
      shape: (-1, 28, 28)
      name: serving_default_graph_input:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['graph_output'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 10)
      name: StatefulPartitionedCall:0
Method name is: tensorflow/serving/predict

在这种情况下,serving_default_graph_input

是输入张量名称,而StatefulPartitionedCall是输出张量名称。然后可以使用TF_GraphOperationByName()加载它们。

有了Tensorflow 2的C API支持,您就可以save the model with a set of defined SignatureDefs然后加载所需的concrete_function(),而不必担心张量名称。但是,此当前方法仍然可以使用。

© www.soinside.com 2019 - 2024. All rights reserved.