python - 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
谢谢!
解决方案
使用非稀疏交叉熵函数,您需要对标签进行一次热编码,以便它们具有与您的 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))
推荐阅读
- azure - Send-MailMessage:无法从传输连接读取数据:net_io_connectionclosed
- python - 在python中搜索带有一个问号的字符串
- sql-server - 如何在 SQL Server 中将 varchar 转换为浮点数?我收到一个错误
- vb.net - 向串口发送和接收数据
- google-apps-script - 每天在特定时间激活谷歌应用脚本?
- javascript - 使用剪辑路径在 div 外显示文本
- html - 如何在我的脚本标签上动态添加 src?
- python - 同时运行两个 dask-ml 输入器,而不是顺序运行
- python - pyspark ML LabeledPoint 不适用于 LinearRegression
- typescript - 为什么 styled-components 样式没有应用到我的 CRA/Typescript/Storybook 项目中?