gpt4 book ai didi

python - Tensorflow:二元分类的损失函数(没有一个热标签)

转载 作者:行者123 更新时间:2023-11-30 09:06:25 37 4
gpt4 key购买 nike

我正在尝试使用二进制交叉熵来解决二元分类问题,并不断遇到以下错误,我尝试过类型转换以及将张量 reshape 为 [-1, 1],但似乎没有任何结果。

我的最后 2 层定义为,

dense_fin2 = tf.layers.dense(输入=dense_fin,单位=128,名称=“dense_fin2”)
logits = tf.sigmoid(tf.layers.dense(inputs = dendense_fin2, 单位 = 1, name = "logits"))

损失函数,

loss = labels * -tf.log(logits) + (1 - labels) * -tf.log(1 - logits)
loss = tf.reduce_mean(loss)

tensorflow 抛出的错误,

ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("Neg:0", shape=(?, 1), dtype=float32)'

额外信息,我正在使用 Estimator API 和 Dataset API。我有整数标签,即 0 或 1。它们是NOT one-hot 编码的。我知道这可以通过对我的标签进行一次热编码来实现,但我不想走这条路。

最佳答案

此错误可能来自于尝试将整数类型标签与浮点类型逻辑相乘。您可以通过 tf.cast(labels, dtype=tf.float32) 显式地将标签转换为 float 。不幸的是,您的问题并未透露您是否尝试过这种特定的转换。

但是,出于数值稳定性的原因,我建议您改用tf.nn.sigmoid_cross_entropy_with_logits(或tf.losses.sigmoid_cross_entropy)。这对于正确性来说也是一个好主意;交叉熵使用对数概率,但您已经输入了 logits(对数非标准化概率),因此额外的 tf.log 实际上是错误的。您还可以向输出层添加 tf.nn.sigmoid 激活以使其正确,但为了稳定性,内置函数仍然更可取。

关于python - Tensorflow:二元分类的损失函数(没有一个热标签),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51155881/

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