首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow - tf.nn.weighted_cross_entropy_with_logits - logits和目标必须具有相同的形状

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

Stack Overflow用户
提问于 2019-03-15 01:41:19
回答 1查看 732关注 0票数 1

我刚刚开始在我正在从事的一个项目中使用tensorflow。该程序的目标是成为一个具有12个特征的二进制分类器。输出可以是普通患者,也可以是疾病患者。这种疾病的流行率非常低,所以我的数据集非常不平衡,有502例正常对照和只有38名疾病患者。出于这个原因,我尝试使用tf.nn.weighted_cross_entropy_with_logits作为我的成本函数。

该代码基于官方tensorflow文档中的虹膜自定义估计器,并使用tf.losses.sparse_softmax_cross_entropy作为成本函数。但是,当我更改为weighted_cross_entropy_with_logits时,我得到一个形状错误,并且我不确定如何修复这个错误。

代码语言:javascript
复制
ValueError: logits and targets must have the same shape ((?, 2) vs (?,))

我已经搜索过了,类似的问题已经通过重塑标签得到了解决--我尝试过这样做,但没有成功(我不明白为什么tf.losses.sparse_softmax_cross_entropy工作得很好,而加权版本却不能)。

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

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-03-15 01:48:50

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

代码语言:javascript
复制
loss = tf.nn.weighted_cross_entropy_with_logits(tf.one_hot(labels, 2), logits, pos_weight)

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

代码语言:javascript
复制
loss = tf.losses.sparse_softmax_cross_entropy(labels, logits,
                                              weights=pos_weight * labels + (1 - labels))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55168906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档