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