使用 TensorFlow 已经有一段时间了,我阅读了一些 Keras 教程并实现了一些示例。我发现有几个使用 keras.losses.binary_crossentropy
作为损失函数的卷积自编码器教程。
我认为 binary_crossentropy
不应该是多类别损失函数,很可能使用二进制标签,但事实上 Keras(TF Python 后端)调用 tf.nn.sigmoid_cross_entropy_with_logits
,它实际上是为具有多个独立类别、不相互排斥的分类任务而设计的。
另一方面,我对 categorical_crossentropy
的期望是用于多类别分类,其中目标类别之间存在依赖关系,但不一定进行 one-hot 编码。
然而,Keras 文档指出:
(...) 当使用 categorical_crossentropy 损失时,目标应处于分类格式中(例如,如果您有 10 类,则每个样本的目标应为一个 10 维向量,在该向量中只有一个索引对应于样本的类别,其他都是零)。
如果我没有误解,这仅是一个 one-hot 编码分类任务的特殊情况,但底层的交叉熵损失也可以处理概率分布(“多类别”,有依赖关系的标签)吗?
此外,Keras 使用 tf.nn.softmax_cross_entropy_with_logits
(TF Python 后端)进行实现,它本身 states:
那么,Keras对损失函数命名背后的想法是什么?文档是否正确?如果二元交叉熵确实依赖于二元标签,那它应该对自动编码器无法起作用,对吗?同样的,如果文档正确,分类交叉熵:只能适用于独热编码标签!
binary_crossentropy
),它们应该是0
或1
。然而(再次,如果我没有弄错的话),这是错误的:Keras(TF Python后端)使用tf.nn.sigmoid_cross_entropy_with_logits
,这是用于多类、独立、非互斥分类问题的。这意味着对于n个输出神经元,每个神经元可以在区间[0.0, 1.0]内具有一个值(最可能是float32)(sigmoid激活)。 - daniel451binary_crossentropy
的期望,对吗?但是如果真的是这种情况,那么(1)自编码器不应使用binary_crossentropy
,(2)使用tf.nn.sigmoid_cross_entropy_with_logits
是错误的,因为它是用于具有非相互排斥标签的独立多类问题的。 - daniel451