python - 在 TensorFlow 中实现重步函数

标签 python tensorflow machine-learning

我想在 TensorFlow 中创建 heaviside step 函数。由于 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。我怎样才能实现这种行为?

最佳答案

一个非常hacky的方法是使用

1 - max(0.0, sign(-x)) 

作为你的步骤函数而不是

max(0.0, sign(x))

另一种选择是使用 greater_equal 并将结果转换为您想要的类型,并使用您已有的 sigmoid 覆盖覆盖其梯度。

关于python - 在 TensorFlow 中实现重步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49796944/

相关文章:

python - 多索引答案 Python 3

python - Adam在keras中是如何实现学习率衰减的

variables - `tf.random_normal` 和 `tf.random_normal_initializer` 有什么区别?

离散相似性度量算法

python - 使用 scikit-learn 加载文本数据时出现问题?

Python 类型错误 'module' 对象不可调用

python - 我该如何解释这个符号?

python - 如何在 keras 神经网络中进行简单的数据记忆

R randomForest 投票平局

python - Healpy map2alm 和 alm2map 不一致?