【问题标题】:Can I use real probability distributions as labels for tf.nn.softmax_cross_entropy_with_logits?我可以使用真实概率分布作为 tf.nn.softmax_cross_entropy_with_logits 的标签吗?
【发布时间】:2018-06-27 07:35:25
【问题描述】:

在 TensorFlow 手册中,标签的描述如下:

labels:每一行labels[i]必须是一个有效的概率分布。

那么,如果我有每个输入的类别的真实概率分布,这是否意味着标签可以如下所示。

[[0.1, 0.2, 0.05, 0.007 ... ]
[0.001, 0.2, 0.5, 0.007 ... ]
[0.01, 0.0002, 0.005, 0.7 ... ]]

而且,它比 one-hot 编码标签更有效吗?

提前谢谢你。

【问题讨论】:

    标签: tensorflow neural-network softmax


    【解决方案1】:

    总之,是的,您可以使用概率作为标签。

    tf.nn.softmax_cross_entropy_with_logits 的文档说你可以:

    注意:虽然类是互斥的,但它们的概率 不必。所需要的只是labels 的每一行是 一个有效的概率分布。如果不是,则计算 渐变会不正确。

    如果使用独占labels(其中只有一个 一次一个类是真的),请参阅sparse_softmax_cross_entropy_with_logits

    让我们举一个简短的例子来确保它可以正常工作:

    import numpy as np
    import tensorflow as tf
    
    labels = np.array([[0.2, 0.3, 0.5], [0.1, 0.7, 0.2]])
    logits = np.array([[5.0, 7.0, 8.0], [1.0, 2.0, 4.0]])
    
    sess = tf.Session()
    ce = tf.nn.softmax_cross_entropy_with_logits(
         labels=labels, logits=logits).eval(session=sess)
    print(ce)  # [ 1.24901222  1.86984602]
    
    # manual check
    predictions = np.exp(logits)
    predictions = predictions / predictions.sum(axis=1, keepdims=True)
    ce_np = (-labels * np.log(predictions)).sum(axis=1)
    print(ce_np)  # [ 1.24901222  1.86984602]
    

    如果你有专属标签,最好使用one-hot编码和tf.nn.sparse_softmax_cross_entropy_with_logits而不是tf.nn.softmax_cross_entropy_with_logits和像[1.0, 0.0, ...]这样的显式概率表示。这样你可以有更短的表示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多