我正在尝试使用二进制交叉熵解决二进制分类问题,并不断遇到以下错误,我尝试了类型转换以及将张量整形为[-1,1],但似乎没有任何效果。 / p>
我的最后2层定义为
dense_fin2 = tf.layers.dense(inputs = dense_fin, units = 128, name = "dense_fin2")
logits = tf.sigmoid(tf.layers.dense(inputs = dense_fin2, units = 1, name = "logits"))
丢失功能
loss = labels * -tf.log(logits) + (1 - labels) * -tf.log(1 - logits)
loss = tf.reduce_mean(loss)
张量流引发的错误
ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("Neg:0", shape=(?, 1), dtype=float32)'
其他信息, 我正在将Estimator API与Dataset API结合使用。我有整数标签,即0或1。它们是不一键编码。我知道可以通过对标签进行热编码来做到这一点,但我不想走这条路。
答案 0 :(得分:1)
此错误可能是由于尝试将整数类型的标签与浮点型logit相乘。您可以明确地将标签强制转换为通过tf.cast(labels, dtype=tf.float32)
浮动。不幸的是,您的问题并未揭示您是否尝试过这种特殊的投射。
但是,出于数值稳定性的考虑,我建议您改用tf.nn.sigmoid_cross_entropy_with_logits
(或tf.losses.sigmoid_cross_entropy
)。这也是正确性的好主意;交叉熵使用对数概率,但是您已经放入了对数(它们是对数非归一化的概率),因此多余的tf.log
实际上是错误的。您还可以在输出层添加tf.nn.sigmoid
激活以使其正确,但是为了保持稳定性,内置函数仍然是可取的。