在TensorFlow 2.0中实施Guided BackProp?

时间:2019-10-28 15:20:55

标签: python tensorflow relu

我正在尝试使用TensorFlow 2.0进行引导反向传播(https://arxiv.org/abs/1412.6806)。要应用引导的反向传播,我们需要修改relu梯度。 我阅读了How to apply Guided BackProp in Tensorflow 2.0?中的对话,并尝试改写 https://gist.github.com/falcondai/561d5eec7fed9ebf48751d124a77b087,但是结果与我预期的不同。我不确定我缺少什么。

这就是我所拥有的(结合以上来源的代码):

import tensorflow as tf

@tf.RegisterGradient("GuidedRelu")
def _GuidedReluGrad(op, grad):
    dtype = op.inputs[0].dtype
    gate_f = tf.cast(op.outputs[0] > 0, dtype) #for f^l > 0
    gate_R = tf.cast(grad > 0, dtype) #for R^l+1 > 0
    return gate_f * gate_R * grad

with tf.compat.v1.get_default_graph().gradient_override_map({'Relu': 'GuidedRelu'}):
    with tf.GradientTape() as tape:
        x = tf.constant([10., 2.])
        tape.watch(x)
        y = tf.nn.relu(x)
        z = tf.reduce_sum(-y ** 2)
        print(x.numpy())
        print(y.numpy())
        print(z.numpy())
        print(tape.gradient(z, x).numpy())

输出为

[10.  2.]
[10.  2.]
-103.99999
[-20.  -4.]

代替

[10.  2.]
[10.  2.]
-103.99999
[0.  0.]

1 个答案:

答案 0 :(得分:1)

在tf2.0 / 2.1中似乎没有一种干净的方法。我使用的解决方法是通过使用自定义ReLU(使用@custom_gradient)来更改ReLU,以修改我的模型。 this thread启发了我。这有点慢,但至少可以。 TF一定会更新,以再次支持渐变重映射。希望它能对您有所帮助。

编辑:讨论该问题here的问题。