网络结构已加载到默认全局图中 . 我想创建另一个具有相同结构的图形,并在此图中加载检查点 .
如果代码是这样的,它会抛出错误: ValueError: No variables to save 在最后一行 . 但是,第二行工作正常 . 为什么? as_graph_def()
返回的 GraphDef
是否包含变量定义/名称?
inference_graph_def = tf.get_default_graph().as_graph_def()
saver = tf.train.Saver()
with tf.Graph().as_default():
tf.import_graph_def(inference_graph_def)
saver1 = tf.train.Saver()
如果这样的代码,它会在最后一行抛出错误 Cannot interpret feed_dict key as Tensor: The name 'save/Const:0' refers to a Tensor which does not exist . 但是,第三行删除后,它可以正常工作 .
inference_graph_def = tf.get_default_graph().as_graph_def()
saver = tf.train.Saver()
with tf.Graph().as_default():
tf.import_graph_def(inference_graph_def)
with session.Session() as sess:
saver.restore(sess, checkpoint_path)
那么,这是否意味着Saver无法在不同的图形中工作,即使它们具有相同的结构?
任何帮助将不胜感激〜
1 回答
下面是一个使用
MetaGraphDef
的示例,它与GraphDef
保存变量集合不同,使用以前保存的图形初始化新图形 .打印类似于:
请注意,检查点仍然很重要!加载
MetaGraph
不会恢复Variables
的值(它不包含这些值),只是跟踪它们存在的记录(集合) . SavedModel format解决此问题,将MetaGraph
与检查点和其他元数据捆绑在一起运行它们 .编辑:根据大众需求,这是一个用
GraphDef
做同样事情的例子 . 我不推荐它 . 由于在加载GraphDef
时没有恢复任何集合,我们必须手动指定Variables
我们希望Saver
恢复; "import/"默认命名方案很容易修复name=''
的name=''
参数,但如果你想让Saver
工作"automatically",则需要手动填写变量集合 . 相反,我选择在创建Saver
时手动指定映射 .