在 c_api 中使用 TF_GraphImportGraphDef 时,Tensorflow 2.2.0 保存的模型中的 GraphDef 无效

Wei*_*huo 5 inference c-api tensorflow

我通过以下方式在 Python 中的 tf 2.2.0 中保存了 keras 模型:

model.save('model', save_format='tf')
Run Code Online (Sandbox Code Playgroud)

它在“model”目录中给了我一个saved_model.pb。我想通过 c_api 进行推理,并且使用以下函数的代码: TF_LoadSessionFromSavedModel 工作正常。

int main() {
    TF_Graph *Graph = TF_NewGraph();
    TF_Status *Status = TF_NewStatus();
    TF_SessionOptions *SessionOpts = TF_NewSessionOptions();
    TF_Buffer *RunOpts = NULL;

    const char *saved_model_dir = "model/";
    const char *tags = "serve";

    int ntags = 1;
    TF_Session *Session = TF_LoadSessionFromSavedModel(SessionOpts, RunOpts, saved_model_dir, &tags, ntags, Graph, NULL, Status);

    if (TF_GetCode(Status) == TF_OK)
    {
        printf("TF_LoadSessionFromSavedModel OK\n");
    }
    else
    {
        printf("%s", TF_Message(Status));
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想通过 TF_GraphImportGraphDef 直接使用“model”目录中的 saving_model.pb,则会出现“Invalid GraphDef”错误:

int main(int argc, char const *argv[]){
    TF_Buffer *Graph_Def = read_file("model/saved_model.pb");
    TF_Graph *Graph = TF_NewGraph();
    TF_Status *Status = TF_NewStatus();
    TF_ImportGraphDefOptions *Opts = TF_NewImportGraphDefOptions();
    TF_GraphImportGraphDef(Graph, Graph_Def, Opts, Status);
    TF_DeleteImportGraphDefOptions(Opts);
    if (TF_GetCode(Status) != TF_OK)
    {
        fprintf(stderr, "ERROR: Unable to import graph %s\n", TF_Message(Status));
        return 1;
    }
    fprintf(stdout, "Successfully imported graph\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想也许saved_model.pb与v1中的freeze_graph版本不同。但我无法找出失败发生的原因。那么,有没有办法通过
TF_GraphImportGraphDef 将 tf2 keras 模型保存在有效的 .pb 文件中,可以独立使用呢?

提前谢谢了。