我刚刚开始在我正在从事的一个项目中使用tensorflow。该程序的目标是成为一个具有12个特征的二进制分类器。输出可以是普通患者,也可以是疾病患者。这种疾病的流行率非常低,所以我的数据集非常不平衡,有502例正常对照和只有38名疾病患者。出于这个原因,我尝试使用tf.nn.weighted_cross_entropy_with_logits作为我的成本函数。
该代码基于官方tensorflow文档中的虹膜自定义估计器,并使用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
谢谢!
发布于 2019-03-15 01:48:50
对于非稀疏交叉熵函数,您需要对标签进行单热编码,以便它们具有与您的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))https://stackoverflow.com/questions/55168906
复制相似问题