3

我有一个在 MNIST 上训练的神经网络,其损失函数为分类交叉熵。

出于理论目的,我的输出层是 ReLu。因此它的很多输出都是0。

现在我偶然发现了以下问题:

为什么我不会得到很多错误,因为我的输出中肯定会有很多零,我会记录下来。

这里,为方便起见,使用分类交叉熵的公式。

L = \sum_{i=1}^m \sum_j L_{i,j} \log y_{i,j}

4

2 回答 2

2

它没有记录在https://keras.io/losses/#categorical_crossentropy中,它似乎取决于后端,但我很确定他们不会记录 log y,而是记录 epsilon 所在的 log(y+ epsilon)防止 log(0) 的小常数。

于 2018-04-25T09:33:01.663 回答
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 添加到剪辑输出中对我来说是个谜。

于 2021-11-27T10:37:09.637 回答