2016-09-30 79 views
3

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

警告:该运算预计未缩放logits,因为它提高效率上执行logits一个SOFTMAX 内部。不要用softmax的 输出调用此操作,因为它会产生不正确的结果。

我的问题:上面只提到了警告缩放通过SOFTMAX完成,还是意味着任何类型的任何分对数比例是被禁止的?如果是后者,那么我的班级重新平衡logit缩放会导致错误的结果?

感谢,

罗恩

+0

好奇你是否找到了适合你的解决方案?我面临着类似的挑战,想知道其他人如何设法处理它? –

+0

我试着将每个例子的交叉熵乘以实例的真实类的权重,结果可疑。我已经采取了重新采样数据。 –

回答

1

的警告只是通知您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或者tf.nn.weighted_cross_entropy_with_logits


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