Keras:binary_crossentropy和categorical_crossentropy混淆

dan*_*451 8 python classification keras tensorflow cross-entropy

在使用TensorFlow很长一段时间之后,我已经阅读了一些Keras教程并实现了一些示例.我找到了几个keras.losses.binary_crossentropy用作损失函数的卷积自动编码器的教程.

我想binary_crossentropy应该不会是一个多级的损失函数,并最有可能使用二进制标签,但实际上Keras(TF Python的后端)称tf.nn.sigmoid_cross_entropy_with_logits,这实际上是用于与多个独立的类是分类任务不是相互排斥的.

另一方面,我的期望categorical_crossentropy是用于多类分类,其中目标类彼此依赖,但不一定是单热编码.

但是,Keras文档指出:

(...)当使用categorical_crossentropy损失时,你的目标应该是分类格式(例如,如果你有10个类,每个样本的目标应该是一个10维向量,在索引处为1的全0期望对应于样本的类别).

如果我没有记错,这只是单热编码分类任务的特例,但潜在的交叉熵损失也适用于概率分布("多类",依赖标签)?

此外,Keras使用tf.nn.softmax_cross_entropy_with_logits(TF python后端)实现,其本身指出:

注意:虽然这些类是互斥的,但它们的概率不一定是.所需要的只是每行标签是有效的概率分布.如果不是,则梯度的计算将是不正确的.

如果我错了,请纠正我,但在我看来Keras文档是 - 至少 - 不是非常"详细"?!

那么,Keras命名损失函数背后的想法是什么?文档是否正确?如果二进制交叉熵真的依赖于二进制标签,它就不适用于自动编码器,对吧?!同样,分类的交叉熵:如果文档是正确的,应该只适用于一个热门的编码标签?!

Max*_*xim 5

通过定义以下每种损失适用的领域,您是正确的:

  • binary_crossentropy(并且tf.nn.sigmoid_cross_entropy_with_logits在幕后)用于二进制多标签分类(标签是独立的)。
  • categorical_crossentropy(并tf.nn.softmax_cross_entropy_with_logits在幕后)用于多类分类(类是排他的)。

另请参阅此问题中的详细分析。

我不确定您指的是什么教程,因此无法评论binary_crossentropy自动编码器的好坏。

至于命名,这是绝对正确和合理的。或者你认为sigmoidsoftmax名字更好的声音?

因此,您的问题中唯一的困惑就是categorical_crossentropy文档。请注意,所陈述的一切都是正确的:损失支持一站式表示。在tensorflow后端的情况下,此函数的确适用于标签的任何概率分布(除了单热矢量之外),它可以包含在doc中,但这对我而言并不重要。此外,需要检查其他后端theano和CNTK是否支持软类。请记住,keras尽量做到简约,并且是大多数流行用例的目标,所以我可以在这里理解逻辑。