Tensorflow:具有交叉熵的缩放 logits

Tensorflow: scaled logits with cross entropy

在 Tensorflow 中,我有一个 classifier 网络和不平衡训练 classes。由于各种原因,我无法使用重采样来补偿不平衡的数据。因此,我不得不通过其他方式来补偿失衡,特别是根据每个 class 中的示例数量将 logits 乘以权重。我知道这不是首选方法,但重采样不是一种选择。我的训练损失操作是 tf.nn.softmax_cross_entropy_with_logits(我也可以尝试 tf.nn.sparse_softmax_cross_entropy_with_logits)。 Tensorflow 文档在这些操作的描述中包含以下内容:

WARNING: This op expects unscaled logits, since it performs a softmax on logits internally for efficiency. Do not call this op with the output of softmax, as it will produce incorrect results.

我的问题:上面的警告是仅指由 softmax 完成的缩放,还是意味着 any 任何类型的 logit 缩放禁止?如果是后者,那么我的 class-重新平衡 logit 缩放会导致错误结果吗?

谢谢,

罗恩

警告只是告诉您 tf.nn.softmax_cross_entropy_with_logits 将在计算交叉熵之前对输入 logits 应用 softmax。这个警告似乎真的避免应用 softmax 两次,因为交叉熵结果会非常不同。

这是相关 source code 中关于实现 tf.nn.softmax_cross_entropy_with_logits 函数的评论:

// NOTE(touts): This duplicates some of the computations in softmax_op
// because we need the intermediate (logits -max(logits)) values to
// avoid a log(exp()) in the computation of the loss.

如警告所述,此实现是为了提高性能,但请注意您不应将自己的 softmax 层作为输入(这在实践中有点方便)。

如果强制 softmax 阻碍了你的计算,也许另一个 API 可以帮助:tf.nn.sigmoid_cross_entropy_with_logits or maybe tf.nn.weighted_cross_entropy_with_logits.


尽管如此,实施似乎并未表明 任何 缩放都会影响结果。我想线性缩放函数应该没问题,只要它保留原始的 logits 重新分区。但是无论在输入 logits 上应用什么,tf.nn.softmax_cross_entropy_with_logits 都会在计算交叉熵之前应用 softmax