将参数从训练转移到推理图

Transfer parameters from training to inference graph

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

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

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

构建推理图时,您应该能够构建一个tf.train.Saver() with no arguments, and it will construct the appropriate save and restore ops for you. You should then be able to call saver.restore(sess, filename)来从文件中恢复变量。

N.B. 对于不带参数工作的构造函数,(i) 推理图中的变量(即 tf.all_variables()) must be a subset of the variables in the training graph, and (ii) the corresponding variables must have exactly the same names. If either of these conditions doesn't hold, you will need to specify a variable name map to the saver constructor. (However, if self.CreateTrainingGraph() calls self.CreateInferenceGraph() before creating any other variables, and doesn't do anything different with tf.name_scope() 的结果,那么这应该没问题。)

(当您加载图形时很少使用 saver_def 参数——例如使用 tf.import_graph_def()——它已经包含来自先前创建的 Saver 的保存和恢复操作。然后它将创建在你的 Python 程序中重用这些操作的 Saver,如果图表不包含这些操作,你将得到一个神秘的错误。)