Graph 排除TensorFlow中优化器正在更新的特定张量

Graph 排除TensorFlow中优化器正在更新的特定张量,graph,tensorflow,gradient-descent,Graph,Tensorflow,Gradient Descent,我有两个图,我想分别训练它们,这意味着我有两个不同的优化器,但同时其中一个使用另一个图的张量值。因此,我需要能够在训练一个图时阻止特定的张量被更新。我已为两个不同的名称域分配了两个my Tensor,并使用此代码控制对不同优化器的Tensor的更新: mentor_training_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "mentor") train_op_mentor = mnist.training(loss_m

我有两个图,我想分别训练它们,这意味着我有两个不同的优化器,但同时其中一个使用另一个图的张量值。因此,我需要能够在训练一个图时阻止特定的张量被更新。我已为两个不同的名称域分配了两个my Tensor,并使用此代码控制对不同优化器的Tensor的更新:

mentor_training_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "mentor")
train_op_mentor = mnist.training(loss_mentor, FLAGS.learning_rate, mentor_training_vars)
mentee_training_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "mentee")
train_op_mentee = mnist.training(loss_mentee, FLAGS.learning_rate, mentee_training_vars)
在mnist对象的训练方法中,vars变量的使用方式如下所示:

def training(loss, learning_rate, var_list):

  # Add a scalar summary for the snapshot loss.
  tf.summary.scalar('loss', loss)
  # Create the gradient descent optimizer with the given learning rate.
  optimizer = tf.train.GradientDescentOptimizer(learning_rate)
  # Create a variable to track the global step.
  global_step = tf.Variable(0, name='global_step', trainable=False)
  # Use the optimizer to apply the gradients that minimize the loss
  # (and also increment the global step counter) as a single training step.
  train_op = optimizer.minimize(loss, global_step=global_step, var_list=var_list)
  return train_op
我使用优化器类的变量列表属性来控制优化器更新的变量

现在我很困惑,我是否已经做了我应该做的适当的事情,即使有任何优化器检查是否只更新了部分图

如果有人能帮我解决这个问题,我将不胜感激


谢谢

我遇到了类似的问题,并使用了与您相同的方法,即通过优化器的
var_list
参数。然后,我使用以下方法检查不用于培训的变量是否保持不变:

the_var_np = sess.run(tf.get_default_graph().get_tensor_by_name('the_var:0'))
assert np.equal(the_var_np, pretrained_weights['the_var']).all()
pretrained_weights
是由
np.load('some_file.npz')
返回的字典,我使用它将预先训练的权重存储到磁盘

以防您也需要它,以下是如何用给定值覆盖张量:

value = pretrained_weights['the_var']
variable = tf.get_default_graph().get_tensor_by_name('the_var:0')
sess.run(tf.assign(variable, value))

我不确定是否有一种简单的方法,但您可以在一些迭代之后记录该值,并检查它是否更改。