为了不将优化器和渐变节点带入推理环境,我正在尝试创建两个版本的图形 - 一个带有训练节点,另一个没有。
想法是使用tensorflow.train.Saver
将变量从火车图版本传递到推理图版本。
所以我尝试了以下内容:
# Create training graph
trainingGraph = tf.Graph()
with (trainingGraph.as_default()):
trainOp, lossOp = self.CreateTrainingGraph()
trainInitOp = tf.initialize_variables(tf.all_variables(), "init_variables")
# Add saver op
self.saverOp = tf.train.Saver()
# Create inference graph
inferenceGraph = tf.Graph()
with (inferenceGraph.as_default()):
self.CreateInferenceGraph()
# Add saver op, compatible with training saver
tf.train.Saver(saver_def=self.saverOp.as_saver_def())
在这种情况下CreateTrainingGraph()
调用CreateInferenceGraph()
并在其上添加优化器和丢失。
出于某种原因,tf.train.Saver
构造函数不会将save/restore_all
节点添加到推理图中(或者我只是不明白saver_def
选项的作用)。我试过空构造函数和
sess.run([model.saverOp._restore_op_name],
{ model.saverOp._filename_tensor_name : "Params/data.pb" })
失败,错误
<built-in function delete_Status> returned a result with an error set
实现这一目标的正确方法是什么?
答案 0 :(得分:5)
构建推理图时,您应该能够构造一个没有参数的tf.train.Saver()
,它将为您构建适当的保存和恢复操作。然后,您应该可以调用saver.restore(sess, filename)
来恢复文件中的变量。
NB 为使构造函数不使用参数,(i)推理图中的变量(即tf.all_variables()
的结果)必须是训练中变量的子集图,和(ii)相应的变量必须具有完全相同的名称。如果这些条件中的任何一个不成立,则需要为saver构造函数指定变量名称映射。 (但是,如果self.CreateTrainingGraph()
在创建任何其他变量之前调用self.CreateInferenceGraph()
,并且与tf.name_scope()
没有任何不同,那么这应该没问题。)
(加载图表时很少使用saver_def
参数 - 例如使用tf.import_graph_def()
- 已经包含来自先前创建的Saver的保存和恢复操作。然后它将创建一个Saver在您的Python程序中重用那些操作,如果图形不包含那些操作,您将收到一个神秘的错误。)