python - 简单问题的 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 高级构建分类器模型时,为什么不会发生这种情况?
解决方案
推荐阅读
- r - R中投资组合优化的student-t分布
- java - 使用 REST 重载的 Java 方法 - org.codehaus.jackson.map.JsonMappingException
- python - 我的 Keras 序列模型的准确度为 0
- pandas - 用 numpy 数组值填充 Pandas 列 NaN
- typescript - 打字稿如何比较两个类
- javascript - 我想过滤数组中的数组并返回满足条件的每个元素
- .net - ASP.net:如何从 CreateHostBuilder() 中登录?
- vue.js - Vuetify data-table body.append slot 移动断点
- javascript - 是否有为 safari 14 创建自定义下载链接的解决方法?
- python - 带有列表的 Python 字典:获取包含特定索引处最大值的列表的键