Реализовать управляемый BackProp в TensorFlow 2.0? - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь применить управляемое обратное распространение (https://arxiv.org/abs/1412.6806) с использованием TensorFlow 2.0. Чтобы применить управляемое обратное распространение, нам нужно изменить градиенты реля. Я прочитал беседу в Как применить управляемое обратное перемещение в 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.]
...