如何获取张量流中某些变量出现的渐变?

时间:2017-04-16 13:25:37

标签: tensorflow

由于tensorflow支持变量重用,因此计算图的某些部分可能在前向和后向过程中多次出现。所以我的问题是,是否有可能在计算图中更新变量?

例如,在 String origin = null; String destination = null; if (mCurrentLocation != null && destLtLng != null) { origin = mCurrentLocation.getLatitude() + Constants.COMMA + mCurrentLocation.getLongitude(); destination = destLtLng.latitude + Constants.COMMA + destLtLng.longitude; 中,X_A->Y_B->Y_A->Y_B出现两次,如何分别更新它们?我的意思是,首先,我们将后一种情况视为常数,然后更新前一种,然后相反。

一个更简单的例子是,比如Y_BX_AY_B都是标量变量,然后让Y_A,这里是Z = X_A * Y_B * Y_A * Y_B wrt的渐变Z的出现次数均为Y_B,但实际上X_A * Y_B * Y_AZ的渐变为Y_B。在该示例中,分别计算梯度似乎是不必要的,但并非总是那些计算可交换的。

在第一个示例中,可以通过调用2*X_A * Y_B * Y_A上的tf.stop_gradient来计算后一个出现的渐变。但是我想不出能够获取前一个的方法。有没有办法在tensorflow的python API中做到这一点?

修改

@Seven提供了一个关于在重用单个变量时如何处理它的示例。然而,它通常是一个可重用的变量范围,它包含许多管理它们的变量和函数。据我所知,他们无法重用变量范围,并将X_A->Y_B应用于它包含的所有变量。

2 个答案:

答案 0 :(得分:1)

根据我的理解,当您使用A = tf.stop_gradient(A)时,A将被视为常量。我在这里有一个例子,也许它可以帮助你。

import tensorflow as tf

wa = tf.get_variable('a', shape=(), dtype=tf.float32,
                     initializer=tf.constant_initializer(1.5))
b = tf.get_variable('b', shape=(), dtype=tf.float32,
                    initializer=tf.constant_initializer(7))

x = tf.placeholder(tf.float32, shape=())
l = tf.stop_gradient(wa*x) * (wa*x+b)
op_gradient = tf.gradients(l, x)


sess = tf.Session()
sess.run(tf.global_variables_initializer())


print sess.run([op_gradient],  feed_dict={x:11})

答案 1 :(得分:0)

我有一个解决这个问题的方法。为相关变量范围定义自定义getter,它使用tf.stop_gradient包装默认getter。这可以将此范围内返回的所有变量设置为Tensor,不会产生任何渐变,但有时事情变得复杂,因为它返回Tensor而不是变量,例如使用tf.nn.batch_norm时。