我可以使用实际概率分布作为tf.nn.softmax_cross_entropy_with_logits的标签吗?

时间:2018-06-27 07:35:25

标签: tensorflow neural-network softmax

在Tensorflow手册中,标签说明如下:

  

标签:每行标签[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 ... ]]

而且,它比一键编码标签更有效吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

总之,您可以将概率用作标签。

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]

如果您有互斥标签,则最好使用单热编码和tf.nn.sparse_softmax_cross_entropy_with_logits,而不要使用tf.nn.softmax_cross_entropy_with_logits和像[1.0, 0.0, ...]这样的显式概率表示。这样可以缩短表示时间。