【发布时间】:2018-09-22 15:07:02
【问题描述】:
我想在 TensorFlow 中创建重载阶梯函数。由于 Heaviside 函数不可微,我还需要选择导数近似并定义自定义梯度,因此完整的实现如下所示:
import tensorflow as tf
@tf.RegisterGradient("HeavisideGrad")
def _heaviside_grad(unused_op: tf.Operation, grad: tf.Tensor):
x = unused_op.inputs[0]
# During backpropagation heaviside behaves like sigmoid
return tf.sigmoid(x) * (1 - tf.sigmoid(x)) * grad
def heaviside(x: tf.Tensor, g: tf.Graph = tf.get_default_graph()):
custom_grads = {
"Sign": "HeavisideGrad"
}
with g.gradient_override_map(custom_grads):
# TODO: heaviside(0) currently returns 0. We need heaviside(0) = 1
sign = tf.sign(x)
# tf.stop_gradient is needed to exclude tf.maximum from derivative
step_func = sign + tf.stop_gradient(tf.maximum(0.0, sign) - sign)
return step_func
在我的实现中有一个警告:tf.sign(0) 返回零值,所以 heaviside(0) 也返回零,我希望 heaviside(0) 返回 1。我怎样才能实现这种行为?
【问题讨论】:
-
是的,我考虑过使用
greater_equal。问题是greater_equal返回 bool Tensor,我不确定如何在向前和向后的步骤中处理浮点到布尔转换。 -
对于前进,您只需施放,对于后退,您将使用已有的内容覆盖它。
标签: python tensorflow machine-learning