需要知道变量在Tensorflow

时间:2018-05-25 18:35:43

标签: python tensorflow

在我的Tensorflow项目中,我需要知道下面定义的train_op是否更新某个变量,如果是,则更新它的次数。

对于前馈网络,这是微不足道的,一次train_op调用会导致变量的一次更新,但如果是Recurrent net,则train_op会导致num_steps 1更新,但由于我在循环图层中有自己的变量,因此我不确定它们是否会更新num_steps次或仅更新一次。

tf.reset_default_graph()
tf.InteractiveSession()
__N = 10
tf_w0 = tf.get_variable(name="w0",\
                   initializer=tf.constant(value=10.00,shape=[__N]),
                   dtype=tf.float32,\
                   trainable=True)

tf_counter = tf.get_variable(name="counter",\
                   initializer=tf.constant(value=0.0,shape=[]),
                   dtype=tf.float32,\
                   trainable=False)

loss = tf.square(tf_w0)

optimizer = tf.train.AdamOptimizer(learning_rate=1e-3)
grads_vars = optimizer.compute_gradients(loss=loss, var_list=tf.trainable_variables()) 

train_op = optimizer.apply_gradients(grads_vars)

如何将计数器附加到变量,以便每次train_op更新时,它还应该递增计数器? 这样我就会知道Tensorflow中的复制层中的变量(我有来自原始2的我自己修改的循环层并且代码有点乱)会像它们应该的那样得到更新。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我非常确定经常性重量只会更新一次。权重在前向传递中重复使用多次。在后向传递中计算多个梯度。将这些渐变添加到一起,然后进行单次更新。

答案 1 :(得分:0)

有一种方法可以做你想要的,但它相当复杂。看起来你有一些不正确的假设。我会尝试澄清一些事情,希望你真的不需要这个柜台。

通常,变量每sess.run(train_op)次调用更新一次。如果您的操作既不在graph function内(很可能不是,这是一个高级概念),也不在while循环内,它最多只会执行一次。如果您使用自动微分(例如optimizer.compute_gradients)而不是自己添加梯度计算操作,则在应用于变量之前,将计算和聚合所有渐变。除非您多次致电optimizer.apply_gradients(),否则申请会完成一次。 apply_gradients是创建改变变量的操作的函数。

即使对于RNN也是如此。在RNN的情况下,梯度计算是在while循环中完成的,但是一旦计算出来,它们仍然被应用一次 - 在循环之外。

如果你真的想添加一个计数器。您可以采取以下粗略方法:

  • 查找图表中变异变量v的所有操作。这些操作包括AssignVariableOpAssignAddVariableOp等。为此,您可以循环图形操作并匹配其类型和输入。 (上面的推理基本上说,只要你使用通常的TensorFlow习语,就会只有一个这样的操作)。
  • 为您的计数器c创建一个变量。
  • 对于您在上面找到的每个变异操作,创建一个assign_add(c, 1)操作并从中添加控制依赖项到变异操作。这样,在执行变异之前,TensorFlow将执行assign_add,这会增加你的计数器。