在tensorflow v1.12中,新定义了一个修饰符函数tf.custom_gradients,用于封装自定义的函数-导数对。
有时候我们想使用tensorflow去计算一些函数的梯度,但会碰到如下情况
def log1pexp(x):
e = tf.exp(x)
return tf.log(1+e)
x = tf.constant(100.)
y = log1pexp(x)
dy = tf.gradients(y,x)
with tf.Session() as sess:
print(sess.run(dy))
运行这段代码,命令行输出为
[nan]
这是因为数据具有不稳定性(numerical instability)。为了使计算机仍然能够输出这个导数,我们需要给出一个计算机能”hold“住的表达式,这里先上代码,再做解释:
@tf.custom_gradient
def log1pexp(x):
e = tf.exp(x)
def grad(dy):