首页 > 解决方案 > Tensorflow - tf.nn.weighted_cross_entropy_with_logits - logits 和目标必须具有相同的形状

问题描述

我刚刚开始在我正在从事的项目中使用 tensorflow。该程序旨在成为一个二元分类器,输入为 12 个特征。输出是正常患者或患有疾病的患者。这种疾病的患病率很低,所以我的数据集非常不平衡,有 502 个正常对照样本,只有 38 个患病患者。出于这个原因,我试图将其tf.nn.weighted_cross_entropy_with_logits用作我的成本函数。

该代码基于官方 tensorflow 文档中的 iris 自定义估计器,并tf.losses.sparse_softmax_cross_entropy用作成本函数。但是,当我更改为 时weighted_cross_entropy_with_logits,我得到一个形状错误,我不知道如何解决这个问题。

ValueError: logits and targets must have the same shape ((?, 2) vs (?,))

我已经搜索过,类似的问题已经通过仅仅重塑标签来解决 - 我试图这样做没有成功(并且不明白为什么tf.losses.sparse_softmax_cross_entropy工作正常而加权版本没有)。

我的完整代码在这里 https://gist.github.com/revacious/83142573700c17b8d26a4a1b84b0dff7

谢谢!

标签: pythontensorflowmachine-learning

解决方案


使用非稀疏交叉熵函数,您需要对标签进行一次热编码,以便它们具有与您的 logits 相同的形状:

loss = tf.nn.weighted_cross_entropy_with_logits(tf.one_hot(labels, 2), logits, pos_weight)

注意tf.losses.sparse_softmax_cross_entropy也承认一个weights参数,尽管它的含义略有不同(它只是一个样本权重)。等效的公式应该是:

loss = tf.losses.sparse_softmax_cross_entropy(labels, logits,
                                              weights=pos_weight * labels + (1 - labels))

推荐阅读