由于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_B
,X_A
,Y_B
都是标量变量,然后让Y_A
,这里是Z = X_A * Y_B * Y_A * Y_B
wrt的渐变Z
的出现次数均为Y_B
,但实际上X_A * Y_B * Y_A
到Z
的渐变为Y_B
。在该示例中,分别计算梯度似乎是不必要的,但并非总是那些计算可交换的。
在第一个示例中,可以通过调用2*X_A * Y_B * Y_A
上的tf.stop_gradient
来计算后一个出现的渐变。但是我想不出能够获取前一个的方法。有没有办法在tensorflow的python API中做到这一点?
修改
@Seven提供了一个关于在重用单个变量时如何处理它的示例。然而,它通常是一个可重用的变量范围,它包含许多管理它们的变量和函数。据我所知,他们无法重用变量范围,并将X_A->Y_B
应用于它包含的所有变量。
答案 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
时。