c++ - 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");
解决方案
推荐阅读
- php - 如何生成多个pdf文件
- django - 如何限制 ForeignKey/ManyToMany Wagtail ModelAdmin 字段中显示的项目?
- javascript - 如何在 HTML 中嵌入我的处理草图
- python - 在图形上绘制多个图形时避免 for 循环
- machine-learning - 作为多类分类的问答的损失函数?
- tags - 创建虚拟机时添加多个标签
- c++ - 从 C++ 中的树莓中捕获 QR 扫描仪的输出
- watson-assistant - Watson Assistant 中的语法嵌套表达式是什么?
- c# - 如何使用表拆分将多个对象映射到 EF Core 中的单个表?
- airflow - 气流 DAG 多次运行