4

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

警告:此操作需要未缩放的 logits,因为它在内部对 logits 执行 softmax 以提高效率。不要用 softmax 的输出调用这个操作,因为它会产生不正确的结果。

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

谢谢,

罗恩

4

1 回答 1

2

该警告只是通知您在计算交叉熵之前tf.nn.softmax_cross_entropy_with_logits将在输入 logits 上应用 a 。softmax这个警告似乎确实避免了两次应用 softmax,因为交叉熵结果会非常不同。

这是相关源代码中关于实现的功能的注释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或者也许tf.nn.weighted_cross_entropy_with_logits.


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

于 2016-09-30T03:40:29.530 回答