- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在使用 TensorFlow 一段时间后,我阅读了一些 Keras 教程并实现了一些示例。我找到了几个使用 keras.losses.binary_crossentropy
作为损失函数的卷积自动编码器的教程。
我认为 binary_crossentropy
应该不是一个多类损失函数并且很可能会使用二进制标签,但实际上 Keras(TF Python 后端)调用 tf.nn.sigmoid_cross_entropy_with_logits
,它实际上用于具有不互斥的多个独立类的分类任务。
另一方面,我对 categorical_crossentropy
的期望是用于多类分类,其中目标类有相互依赖,但不一定是一个-热编码。
但是,Keras 文档指出:
(...) when using the categorical_crossentropy loss, your targets should be in categorical format (e.g. if you have 10 classes, the target for each sample should be a 10-dimensional vector that is all-zeros expect for a 1 at the index corresponding to the class of the sample).
如果我没记错的话,这只是单热编码分类任务的特例,但潜在的交叉熵损失也适用于概率分布(“多类”、依赖标签)?
此外,Keras 使用 tf.nn.softmax_cross_entropy_with_logits
(TF python 后端)来实现,它本身 states :
NOTE: While the classes are mutually exclusive, their probabilities need not be. All that is required is that each row of labels is a valid probability distribution. If they are not, the computation of the gradient will be incorrect.
如果我错了请纠正我,但在我看来 Keras 文档 - 至少 - 不是很“详细”?!
那么,Keras 对损失函数的命名背后的想法是什么?文档是否正确?如果二元交叉熵真的依赖于二元标签,它应该不适用于自动编码器,对吧?!同样,分类交叉熵:如果文档正确,应该只适用于单热编码标签?!
最佳答案
您通过定义这些损失中的每一个适用的区域是正确的:
binary_crossentropy
(和引擎盖下的 tf.nn.sigmoid_cross_entropy_with_logits
)用于二进制多标签分类(标签是独立的)。categorical_crossentropy
(和引擎盖下的 tf.nn.softmax_cross_entropy_with_logits
)用于多类分类(类是独占的)。另请参阅 this question 中的详分割析.
我不确定你指的是什么教程,所以无法评论 binary_crossentropy
是自编码器的好选择还是坏选择。
至于命名,绝对正确合理。还是您认为 sigmoid
和 softmax
名称听起来更好?
因此,您的问题中唯一令人困惑的是 categorical_crossentropy
文档。请注意,所陈述的一切都是正确的:损失支持单热表示。在 tensorflow 后端的情况下,此函数确实适用于标签的任何概率分布(除了单热向量)并且它可以包含在文档中,但这并不看起来对我很挑剔。此外,需要检查其他后端是否支持soft classes,theano和CNTK。请记住,keras 力图做到极简主义并以最流行的用例为目标,因此我可以理解这里的逻辑。
关于python - Keras:binary_crossentropy 和 categorical_crossentropy 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47877083/
我正在尝试使用 ML5 库在我正在构建的 React 应用程序中进行分类。 我的浏览器出现以下错误 错误:您在使用损失“categorical_crossentropy”时传递形状为 11342,1
我正在构建一个多类 CNN 模型,但由于损失形状错误,我无法编译该模型。 输出层和标签都应具有正确的形状;标签为 (m, 1, 3),最终密集层包含 3 个具有 softmax 激活的感知 loss=
我有一个 Keras 模型,用于解决多类分类问题。我这样做: model.compile( loss='categorical_crossentropy', optimizer='ad
在 Tensorflow2 中,我可以使用类 tf.keras.losses.CategoricalCrossentropy ( defined here ) 或函数 categorical_cros
sparse_categorical_crossentropy 和 categorical_crossentropy 有什么区别?什么时候应该使用一种损失而不是另一种?例如,这些损失是否适合线性回归?
我正在尝试应用蒸馏的概念,基本上是为了训练一个新的较小的网络,使其与原始网络的功能相同,但计算量更少。 我有每个样本的 softmax 输出而不是 logits。 我的问题是,分类交叉熵损失函数是如何
我正在使用自定义训练循环。 tf.keras.losses.categorical_crossentropy返回的损失是我假设的数组 (1,batch_size) .这是它应该返回的值还是单个值? 在
我正在使用深度神经网络进行二元类分类。每当我使用binary_crossentropy时,我的模型都没有给出很好的准确性(它更接近随机预测)。但是,如果我通过将输出层的大小设置为 2 来使用分类交叉熵
我正在训练一个文本分类模型,其中输入数据由 4096 个词频 - 逆向文档频率组成。 我的输出是 416 个可能的类别。每条数据有 3 个类别,所以 413 个零的数组中有 3 个(one-hot-e
在使用 TensorFlow 一段时间后,我阅读了一些 Keras 教程并实现了一些示例。我找到了几个使用 keras.losses.binary_crossentropy 作为损失函数的卷积自动编码
我正在尝试在 keras 中模拟 pytorch 神经网络。 我确信我的 keras 版本的神经网络与 pytorch 中的非常接近,但在训练期间,我看到 pytorch 网络的损失值远低于 kera
我正在尝试训练 CNN 按主题对文本进行分类。当我使用二元交叉熵时,我获得了约 80% 的准确度,而使用分类交叉熵时,我获得了约 50% 的准确度。 我不明白这是为什么。这是一个多类问题,这是否意味着
努力使子类损失函数在 Tensorflow (2.2.0) 中工作。 最初尝试了此代码(我知道它对其他人有用 - 请参阅 https://github.com/keras-team/keras/iss
我有一个专为多分类问题设计的 LSTM 模型。训练时,准确率实际上是 1.00。但仍然返回小的损失值。这是什么意思?所有目标都被正确预测。为什么损失值不能为零? adadelta = Adadelta
我正在学习如何使用 Keras 创建卷积神经网络。我正在尝试获得 MNIST 数据集的高精度。 显然categorical_crossentropy适用于2个以上的类,binary_crossentr
导入库和模型, from __future__ import print_function import keras from keras.datasets import mnist from ker
我正在尝试对 theano 中的多重损失求和,但我无法使其工作。我正在使用分类交叉熵。 这是我的代码: import numpy as np import theano import theano.t
我正在关注 TensorFlow basic classification example使用“入门”文档中提供的 Keras API。我按原样完成了教程,但是如果我将损失函数从 sparse_cat
我是一名优秀的程序员,十分优秀!