请参见下面的tensorflow 2.x代码,在图形模式下。du
的梯度将是None
,因为u
不依赖于x
。在我的应用程序中,du
有时是None
,有时是Tensor。因此,我希望在需要时将du
设置为0.0
,而不是None
。我的代码不起作用,请参阅下面的错误。如何在TensorFlow图模式中正确实现这一点?
x = tf.Variable(1.0)
y = tf.Variable(1.0)
@tf.function
def func():
with tf.GradientTape() as tape:
u = y + 3.0
du = tape.gradient(u, x)
du = tf.cond(tf.cast(du == None, tf.bool), lambda: 0.0, lambda: du)
return du
print(func())
错误:
ValueError: in user code:
File "/tmp/ipykernel_5106/913668970.py", line 10, in func *
du = tf.cond(tf.cast(du == None, tf.bool), lambda: 0.0, lambda: du)
...
ValueError: Lengths of branch outputs of cond must match.
len(graphs[0].outputs): 1
len(graphs[1].outputs): 0
请注意,下面的代码运行良好(du
不是None,因为u = y + 3.0 + x
):
x = tf.Variable(1.0)
y = tf.Variable(1.0)
@tf.function
def func():
with tf.GradientTape() as tape:
u = y + 3.0 + x
du = tape.gradient(u, x)
du = tf.cond(tf.cast(du == None, tf.bool), lambda: 0.0, lambda: du)
return du
print(func())
输出:tf.Tensor(1.0, shape=(), dtype=float32)
1条答案
按热度按时间sirbozc51#
使用
zero_if_none
函数可以做到这一点: