tensorflow中的tf.control_dependencies与sess.run运行两次或一次之间有什么区别

时间:2018-07-01 12:58:16

标签: tensorflow

我定义了一个张量流模型,并希望通过自己的优化器对其进行训练。但我遇到一个问题。

以下代码忽略模型的定义,仅保留优化部分。

P = tf.global_variables()

lr = 0.1

update_ops = []
grads1 = tf.gradients(loss, P)

for p,g in zip(P, grads1):
    update_ops.append(tf.assign(p, p - lr * g))


with tf.control_dependencies(update_ops):

    update_ops_2 = []
    grads2 = tf.gradients(loss, P)

    for p,g in zip(P, grads2):
        update_ops_2.append(tf.assign(p, p - lr * g))

我循环跑步:

for i in range(1000):

    _ = sess.run(update_ops_2, feed_dict={myinput: mydata})

但损失无法减少,但我却奔跑

for i in range(1000):
    for j in range(2):
        _ = sess.run(update_ops, feed_dict={myinput: mydata})

损失可以减少。

它们之间有什么不同?我想一次sess.run两次获得梯度怎么办?

1 个答案:

答案 0 :(得分:0)

此代码示例中的优化工作顺利进行,您能否提供完整的代码?

import tensorflow as tf
# from tensorflow.python.ops.resource_variable_ops import ResourceVariable

# x = ResourceVariable(2.)
x = tf.Variable(2.)
loss = tf.square(x)
P = tf.global_variables()

lr = 0.1

update_ops = []
grads1 = tf.gradients(loss, P)

for p, g in zip(P, grads1):
    update_ops.append(tf.assign(p, p - lr * g))


with tf.control_dependencies(update_ops):

    update_ops_2 = []
    grads2 = tf.gradients(loss, P)

    for p, g in zip(P, grads2):
        update_ops_2.append(tf.assign(p, p - lr * g))


sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(20):
    _, l, xx = sess.run((update_ops_2, loss, x))
    print(l, xx)