为何categorical_crossentropy输出为16.118?数学原理存疑
TensorFlow分类交叉熵计算的疑问解答
问题1:为何log(0)没有引发错误,反而得到16.118的结果?
TensorFlow的categorical_crossentropy为了避免数值不稳定(比如log(0)导致的无穷大或计算错误),会对输入的预测概率值做数值裁剪处理:它会将所有预测值限制在[1e-7, 1-1e-7]的范围内,不会直接使用原始的0或1。
在你的例子中,y_pred_one_hot里索引1位置的0会被替换成近似0的极小值(比如1e-7),计算log(1e-7)得到约-16.118,再加上公式里的负号,最终得到16.118,这就是你看到的结果。
问题2:y_true与y_pred的0值索引重合,求和结果为何不为0?
标准分类交叉熵公式为:
$$H(y_{true}, y_{pred}) = -\sum_{i} y_{true,i} \times \log(y_{pred,i})$$
注意公式中只有当y_true,i=1的项才会被保留(其他项乘以0后直接消失)。你的y_true_one_hot中只有索引1位置是1,所以只需要计算该位置的项:
$$-1 \times \log(y_{pred,1})$$
而y_pred,1是0(被裁剪为极小值),所以计算结果是一个较大的正数,而非0。那些0值索引重合的位置,因为y_true,i=0,对应的项都为0,根本不参与求和计算,所以不会让结果变成0。
内容的提问来源于stack exchange,提问作者user3668129
相关产品推荐
相关产品推荐

