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))
每次生成不同的输入。
我正在学习 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))
每次生成不同的输入。