gpt4 book ai didi

python - Tensorflow - tf.nn.weighted_cross_entropy_with_logits - logits 和目标必须具有相同的形状

转载 作者:行者123 更新时间:2023-11-30 09:04:49 28 4
gpt4 key购买 nike

我刚刚开始在我正在进行的项目中使用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

谢谢!

最佳答案

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

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

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

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

关于python - Tensorflow - tf.nn.weighted_cross_entropy_with_logits - logits 和目标必须具有相同的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55168906/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com