在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高级构建的分类器模型时,为什么不会发生这种情况?