Tensorflow 自定义梯度没有给出预期的答案

Tensorflow custom gradient not giving expected answer

我正在学习 Tensorflow 1.14 中的自定义渐变。我通过为一个简单的 ReLu 函数定义自定义梯度来测试它,如下所示:

import numpy as np
import tensorflow as tf 

@tf.custom_gradient
def rateFunction(v_):
    z_ = tf.nn.relu(v_)

    def grad(dy):
        dz_dv = tf.where(tf.greater(v_, 0.), tf.ones_like(v_), tf.zeros_like(v_))

        dv = dy * dz_dv

        return [dv]

    return z_, grad

# define test input 
vv = tf.random.normal((32,100))

# output from customized gradient
z1 = rateFunction(vv)

并且我希望使用自定义梯度计算的梯度与实际 ReLU 的梯度相匹配,但事实并非如此:

# output of actual relu
z2 = tf.nn.relu(vv)

# Compute the gradient
sess = tf.Session()
dzdv1=sess.run(tf.gradients(z1, vv)[0])
dzdv2=sess.run(tf.gradients(z2, vv)[0])

# Expect to match, i.e. difference to be 0
print(np.mean(np.abs(dzdv1-dzdv2)))

但预期和实际之间的差异不是零。我得到的平均绝对差约为 0.49。有人可以向我解释为什么会这样吗?非常感谢!

问题来自

vv = tf.random.normal((32,100))

每次生成不同的输入。