将参数从训练传递到推理图

时间:2015-12-24 15:28:22

标签: variables tensorflow inference

为了不将优化器和渐变节点带入推理环境,我正在尝试创建两个版本的图形 - 一个带有训练节点,另一个没有。

想法是使用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

实现这一目标的正确方法是什么?

1 个答案:

答案 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程序中重用那些操作,如果图形不包含那些操作,您将收到一个神秘的错误。)