首页 > 解决方案 > 简单问题的 TF 梯度返回零

问题描述

在 TF 2.0 中,我追溯了一个错误并隔离了这个简单的问题:tf.gradient 给出的梯度为零,它应该是无穷大。

bxe = tf.keras.losses.BinaryCrossentropy(); 
a=tf.Variable(1.0) 
with tf.GradientTape() as tape: 
   loss = bxe([0.], a) 
grads = tape.gradient(loss, a) # compute gradients 
print(loss, grads) 

tf.Tensor(15.333239, shape=(), dtype=float32) 
tf.Tensor(0.0, shape=(), dtype=float32)

如您所见,损失应该是无限的,原因是二进制交叉熵中的 -log(1-1)。但是,我查阅了文档,发现他们在应用日志之前剪掉了数字,这就是为什么显示 15.333 而不是无穷大的原因。这很好,并且有助于避免训练过程中的许多麻烦,但是,梯度呢?它的产量为零!根据我的数学,它应该是无限的,所以,至少它应该产生非常高的东西,而不是零。因此,我的训练被卡住了!为什么会这样?我是怎么走到这一步的?当我使用 Keras 高级构建分类器模型时,为什么不会发生这种情况?

标签: pythontensorflowtensorflow2.0

解决方案


推荐阅读