首页 > 解决方案 > Tensorflow C++ - 加载两个图时避免名称重叠

问题描述

由于管道的早期部分,我有两个 .pb 文件,其中包含一个冻结优化的 Tensorflow 图,用于相同生产模型的略有不同的架构。我想将它们在同一个 C++ 程序中加载到同一个会话中进行推理,但是当然图形节点有很多冲突的名称。

在 Python 中,我的印象是您可以将下面的两个图加载到不同变量范围内的同一会话中,但在 C++ 中,我不确定如何执行此操作。

所以我基本上一直在做以下事情,这似乎有效,但像这样手动执行似乎有点笨拙和脆弱,特别是处理控制边缘名称中的插入符号。这是一种合理的方法吗,和/或 C++ api 中是否有一个预先存在的函数,我可以调用它来完成同样的事情?

Status status;
GraphDef graphDef1;
GraphDef graphDef2;

status = ReadBinaryProto(Env::Default(), string("frozen_graph_optimized1.pb"), &graphDef1);
CHECK_STATUS(status,"reading graph1");
status = ReadBinaryProto(Env::Default(), string("frozen_graph_optimized2.pb"), &graphDef2);
CHECK_STATUS(status,"reading graph2");

auto addPrefixToGraph = [](GraphDef& graphDef, const string& prefix) {
  for(int i = 0; i<graphDef.node_size(); ++i)
  {
    auto node = graphDef.mutable_node(i);
    string* name = node->mutable_name();
    *name = prefix + *name;
    int inputSize = node->input_size();
    for(int j = 0; j<inputSize; ++j) {
      string* inputName = node->mutable_input(j);
      if(inputName->size() > 0 && (*inputName)[0] == '^')
        *inputName = "^" + prefix + inputName->substr(1);
      else
        *inputName = prefix + *inputName;
    }
  }
};
addPrefixToGraph(graphDef1,"g1/");
addPrefixToGraph(graphDef2,"g2/");

status = session->Create(graphDef1);
CHECK_STATUS(status,"adding graph1 to session");
status = session->Extend(graphDef2);
CHECK_STATUS(status,"adding graph2 to session");

标签: c++tensorflow

解决方案


推荐阅读