我有一个在 MNIST 上训练的神经网络,其损失函数为分类交叉熵。
出于理论目的,我的输出层是 ReLu。因此它的很多输出都是0。
现在我偶然发现了以下问题:
为什么我不会得到很多错误,因为我的输出中肯定会有很多零,我会记录下来。
这里,为方便起见,使用分类交叉熵的公式。
我有一个在 MNIST 上训练的神经网络,其损失函数为分类交叉熵。
出于理论目的,我的输出层是 ReLu。因此它的很多输出都是0。
现在我偶然发现了以下问题:
为什么我不会得到很多错误,因为我的输出中肯定会有很多零,我会记录下来。
这里,为方便起见,使用分类交叉熵的公式。
它没有记录在https://keras.io/losses/#categorical_crossentropy中,它似乎取决于后端,但我很确定他们不会记录 log y,而是记录 epsilon 所在的 log(y+ epsilon)防止 log(0) 的小常数。
Keras 使用一个常量裁剪网络输出,并在执行此处1e-7
定义的对数运算之前再次将此常量添加到裁剪后的输出中。
epsilon_ = _constant_to_tensor(epsilon(), output.dtype.base_dtype)
output = clip_ops.clip_by_value(output, epsilon_, 1. - epsilon_)
# Compute cross entropy from probabilities.
bce = target * math_ops.log(output + epsilon())
bce += (1 - target) * math_ops.log(1 - output + epsilon())
return -bce
为什么 Keras 再次将 epsilon 添加到剪辑输出中对我来说是个谜。