【发布时间】:2020-03-17 00:44:50
【问题描述】:
我无法从加载 C_API 的 tensorflow 2.0 SavedModel 运行推理,因为我无法按名称访问输入和输出操作。
我通过 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)显示具有这些名称的男高音存在于SignatureDefserving_default 下,所以我想我需要将serving_default 实例化为一个图形(换句话说,创建根据签名的图表),但是我找不到使用 C API 的方法。
请注意,tensorflows 的 C_API test 使用 C++ tensorflow/core/ 功能从元图加载签名定义映射并使用它来查找输入和输出操作名称,但我想避免对 C++ 的依赖。
另请注意,按名称访问操作适用于冻结的 .pb 图,但此格式已被弃用。
提前感谢您的任何想法和提示!
【问题讨论】:
-
本教程似乎有一个解决方案,虽然不是那么优雅,因为您仍然需要通过 saved_model_cli medium.com/analytics-vidhya/… 分析定义的签名
标签: c tensorflow tensorflow-serving tensorflow2.0 c-api