在使用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 回答
您可以通过定义每种损失适用的区域来确定:
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
是否是自动编码器的好或坏选择 .至于命名,这是绝对正确和合理的 . 或者您认为
sigmoid
和softmax
名称听起来更好?因此,您问题中唯一的混淆是
categorical_crossentropy
文档 . 请注意,已声明的所有内容都是正确的:损失支持单热表示 . 在张量流后端的情况下,此函数确实适用于标签的任何概率分布(除了单热矢量),并且它可以包含在文档中,但这对我来说并不重要 . 此外,需要检查其他后端,theano和CNTK是否支持软类 . 请记住,keras试图成为最简单的并且是大多数流行用例的目标,因此我可以理解这里的逻辑 .不确定这是否能回答你的问题,但是对于softmax损失,输出层需要是概率分布(即总和为1),对于二进制的交叉熵损失则不然 . 就那么简单 . (二进制并不意味着只有2个输出类,它只意味着每个输出都是二进制的 . )