在我的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的我自己修改的循环层并且代码有点乱)会像它们应该的那样得到更新。
提前致谢。
答案 0 :(得分:0)
我非常确定经常性重量只会更新一次。权重在前向传递中重复使用多次。在后向传递中计算多个梯度。将这些渐变添加到一起,然后进行单次更新。
答案 1 :(得分:0)
有一种方法可以做你想要的,但它相当复杂。看起来你有一些不正确的假设。我会尝试澄清一些事情,希望你真的不需要这个柜台。
通常,变量每sess.run(train_op)
次调用更新一次。如果您的操作既不在graph function内(很可能不是,这是一个高级概念),也不在while循环内,它最多只会执行一次。如果您使用自动微分(例如optimizer.compute_gradients
)而不是自己添加梯度计算操作,则在应用于变量之前,将计算和聚合所有渐变。除非您多次致电optimizer.apply_gradients()
,否则申请会完成一次。 apply_gradients
是创建改变变量的操作的函数。
即使对于RNN也是如此。在RNN的情况下,梯度计算是在while循环中完成的,但是一旦计算出来,它们仍然被应用一次 - 在循环之外。
如果你真的想添加一个计数器。您可以采取以下粗略方法:
v
的所有操作。这些操作包括AssignVariableOp
,AssignAddVariableOp
等。为此,您可以循环图形操作并匹配其类型和输入。 (上面的推理基本上说,只要你使用通常的TensorFlow习语,就会只有一个这样的操作)。c
创建一个变量。assign_add(c, 1)
操作并从中添加控制依赖项到变异操作。这样,在执行变异之前,TensorFlow将执行assign_add
,这会增加你的计数器。