首页 文章

Keras:binary_crossentropy和categorical_crossentropy混淆

提问于
浏览
5

在使用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维向量,全0期望1为1对应于样本类的索引) .

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

另外,Keras使用 tf.nn.softmax_cross_entropy_with_logits (TF python后端)进行实现,其本身states

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

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

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

2 回答

  • 4

    您可以通过定义每种损失适用的区域来确定:

    • binary_crossentropy(和引擎盖下的 tf.nn.sigmoid_cross_entropy_with_logits )用于二进制多标签分类(标签是独立的) .

    • categorical_crossentropy(和引擎盖下的 tf.nn.softmax_cross_entropy_with_logits )用于多类分类(类是独占的) .

    另见this question中的详细分析 .

    我'm not sure what tutorials you mean, so can' t评论 binary_crossentropy 是否是自动编码器的好或坏选择 .

    至于命名,这是绝对正确和合理的 . 或者您认为 sigmoidsoftmax 名称听起来更好?

    因此,您问题中唯一的混淆是 categorical_crossentropy 文档 . 请注意,已声明的所有内容都是正确的:损失支持单热表示 . 在张量流后端的情况下,此函数确实适用于标签的任何概率分布(除了单热矢量),并且它可以包含在文档中,但这对我来说并不重要 . 此外,需要检查其他后端,theano和CNTK是否支持软类 . 请记住,keras试图成为最简单的并且是大多数流行用例的目标,因此我可以理解这里的逻辑 .

  • 0

    不确定这是否能回答你的问题,但是对于softmax损失,输出层需要是概率分布(即总和为1),对于二进制的交叉熵损失则不然 . 就那么简单 . (二进制并不意味着只有2个输出类,它只意味着每个输出都是二进制的 . )

相关问题