使用两个张量流模型,其中一个用于推理,另一个用于训练

时间:2018-06-24 14:31:26

标签: tensorflow

我是Tensorflow的新手,我试图在一个图中组合两个模型,因为我需要一个模型的推断结果来修改另一个模型的损失函数。我编写了代码,它运行时没有错误,但是我不确定我是否正确编写了代码,所以我正在编写此线程。

在代码中,我像这样加载了两个图

with tf.variable_scope("modelA"):
  new_saver = tf.train.import_meta_graph('modelA-1000.meta')
  new_saver.restore(sess, tf.train.latest_checkpoint('./'))

with tf.variable_scope("modelB"):
  new_saver = tf.train.import_meta_graph('modelB-1000.meta')
  new_saver.restore(sess, tf.train.latest_checkpoint('./'))

然后我使用modelA的结果按如下方式修改modelB的损失函数

output_A = tf.get_default_graph().get_tensor_by_name("modelA_output:0")
output_B = tf.get_default_graph().get_tensor_by_name("modelB_output:0")
loss = tf.reduce_mean(-tf.reduce_sum(output_A * tf.log(output_B ), reduction_indices=[1])) 

然后为了进行训练,我只包括要训练的modelB变量,因为我只想将模型A用作推理。

model_vars = tf.trainable_variables()
var_B = [var for var in model_vars if 'modelB' in var.name]
gradient = tf.gradients(loss,var_B)
trainer = tf.train.GradientDescentOptimizer(0.1)
train_step = trainer.apply_gradients(zip(gradient ,var_B))

... declare session and prepare batch for training ...

for i in range(10000):
    loss_ = train_step.run(loss, feed_dict={x: batch[0]})

我运行了它,代码运行了,但是损失并没有减少。我做错了什么?感谢您的阅读!

1 个答案:

答案 0 :(得分:0)

我不确定这段代码如何运行。 train_stepOperationOperation.run()方法使用feed_dict和可选的session。我不知道train_step.run(loss, feed_dict={x: batch[0]})的运行方式。通常,您会执行以下操作:

with tf.Session() as sess:
   _, _loss = sess.run([train_step, loss], feed_dict=...)

请注意,如果您首先具有生成modelA和modelB的代码。最好重新运行该代码以重新创建图形(即不那么脆弱)。创建图形后,您可以使用Saver从检查点恢复变量值。这样可以避免像

output_A = tf.get_default_graph().get_tensor_by_name("modelA_output:0")