Tensorflow C ++-加载两个图形时避免名称重叠

时间:2018-07-22 12:16:58

标签: c++ tensorflow

由于管道的早期部分,我有两个.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");

0 个答案:

没有答案