在Tensorflow中,我有一个分类器网络和不 balancer 的培训课程 . 由于各种原因,我不能使用重新采样来补偿不 balancer 的数据 . 因此,我不得不通过其他方式补偿失衡,特别是根据每个类中的示例数量将logits乘以权重 . 我知道这不是首选方法,但重新采样不是一种选择 . 我的训练损失是 tf.nn.softmax_cross_entropy_with_logits
(我也可以尝试 tf.nn.sparse_softmax_cross_entropy_with_logits
) . Tensorflow文档在这些操作的描述中包括以下内容:
警告:此操作需要未缩放的日志,因为它在内部执行logmax以提高效率 . 不要使用softmax的输出调用此op,因为它会产生不正确的结果 .
我的问题:上面的警告是指仅由softmax完成的缩放,还是意味着禁止任何类型的任何logit缩放?如果是后者,那么我的类重新 balancer logit缩放会导致错误的结果吗?
谢谢,
罗恩
1 回答
在计算交叉熵之前,警告只会通知您
tf.nn.softmax_cross_entropy_with_logits
将在输入对数上应用softmax
. 这个警告似乎真的避免两次应用softmax,因为交叉熵结果会非常不同 .以下是相关source code中关于实现
tf.nn.softmax_cross_entropy_with_logits
的函数的注释:正如警告所述,此实现是为了提高性能,但需要注意的是,您不应将自己的
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
.