要将训练有素的网络导入 C++,您需要导出网络才能执行此操作。经过大量搜索,几乎没有找到关于它的信息,明确了我们应该使用 freeze_graph() 才能做到这一点。
感谢新的 0.7 版本的 Tensorflow,他们添加了它的 文档。
查看文档后,我发现几乎没有类似的方法,您能说出 freeze_graph()
和: tf.train.export_meta_graph
之间有什么区别,因为它具有相似的参数,但似乎也可以用于将模型导入 C++ (我只是猜想不同之处在于,使用这种方法输出的文件只能使用 import_graph_def()
还是其他?)
Also one question about how to use write_graph()
: In documentations the graph_def
is given by sess.graph_def
but in examples in freeze_graph()
it is sess.graph.as_graph_def()
。这两者有什么区别?
这个问题与 这个问题有关。
谢谢!
原文由 Hamed MP 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是我利用 TF 0.12 中引入的 V2 检查点的解决方案。
无需将所有变量转换为常量或 冻结图形。
为清楚起见,V2 检查点在我的目录
models
中如下所示:Python部分(保存)
如果您使用
Saver
创建tf.trainable_variables()
,您可以节省一些头痛和存储空间。但也许一些更复杂的模型需要保存所有数据,然后将此参数删除到Saver
,只需确保在创建图表 后 创建Saver
。为所有变量/层赋予唯一名称也是非常明智的,否则您可能会遇到 不同的问题。Python部分(推理)
C++部分(推理)
请注意,
checkpointPath
不是任何现有文件的路径,只是它们的公共前缀。如果您错误地将.index
文件的路径放在那里,TF 不会告诉您这是错误的,但由于未初始化的变量,它会在推理过程中死亡。