梯度错误地不返回

时间:2018-09-03 01:36:46

标签: python tensorflow

print("\ncomputed 1")
x=tfe.Variable(np.random.uniform(size=[166,]), name='x', dtype=tf.float64)
print(compute_cost(tf.constant(normed_data[:10], dtype=tf.float64), x))

print("\ncomputed 2")
x=tfe.Variable(np.random.uniform(size=[166,]), name='x', dtype=tf.float64)
print(compute_cost(tf.constant(normed_data[:10], dtype=tf.float64), x))

print("\ncomputed 0")
x=tfe.Variable(np.zeros((166,)), name='x', dtype=tf.float64)
print(compute_cost(tf.constant(normed_data[:10], dtype=tf.float64), x))

print("\ncomputed 0")
x=tfe.Variable(np.zeros((166,)), name='x', dtype=tf.float64)
print(compute_cost(tf.constant(normed_data[:10], dtype=tf.float64), x))

输出:

computed 1
tf.Tensor(0.00627350861776064, shape=(), dtype=float64)

computed 2
tf.Tensor(0.0032756996843633264, shape=(), dtype=float64)

computed 0
tf.Tensor(19.318829784931626, shape=(), dtype=float64)

computed 0
tf.Tensor(19.318829784931626, shape=(), dtype=float64)

显然,tfe.Variable x正在影响损失函数,因此梯度不应为None / 0。但这是...

x=tfe.Variable(np.random.uniform(size=[166,]), name='x', dtype=tf.float64)
f_grad = tfe.gradients_function(lambda s: compute_cost(tf.constant(normed_data[:10], dtype=tf.float64), s), params=['s'])
print("\nGradient " + str(f_grad(x)))

输出:

Gradient [None]

有人可以解释出什么问题吗?使用Tensorflow 1.10.1并渴望执行。

1 个答案:

答案 0 :(得分:1)

返回None的值表示函数的输出与变量之间没有依赖关系。

查看链接到I see a numpy operation (np.log) in therecompute_cost函数,这将打破可区分操作的“痕迹”。请注意,TensorFlow只能通过TensorFlow操作来计算梯度。

类似于your other question,用相应的TensorFlow一个(tf.log)替换numpy操作应该可以解决问题。

希望有帮助。