【问题标题】:Tensorflow: Loss function for Binary classification (without one hot labels)Tensorflow:二进制分类的损失函数(没有一个热标签)
【发布时间】:2018-12-11 20:16:41
【问题描述】:

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

我的最后 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。它们是 NOT 单热编码的。我知道这可以通过一个热编码我的标签来实现,但我不想走那条路。

【问题讨论】:

    标签: python tensorflow machine-learning


    【解决方案1】:

    此错误可能来自尝试将整数类型标签与浮点类型 logits 相乘。您可以通过tf.cast(labels, dtype=tf.float32) 明确地将标签转换为浮动。不幸的是,您的问题并未显示您是否尝试过这种特定的演员阵容。

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

    【讨论】:

    • 我已经投射了标签,它似乎可以通过,但是使用 tf.nn.sigmoid_cross_entropy_with_logits 会产生这个错误 InvalidArgumentError (see above for traceback): Input to reshape is a tensor with 8 values, but the requested shape has 1,另一方面,使用我上面提到的损失函数会产生 NaN 错误。所以你关于数值稳定性的观点似乎是有效的。
    猜你喜欢
    • 2018-10-27
    • 2019-09-08
    • 2016-05-11
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多