在二进制分类的情况下,最后一个密集层中的单元数

Posted

技术标签:

【中文标题】在二进制分类的情况下,最后一个密集层中的单元数【英文标题】:Number of units in the last dense layer in case of binary classification 【发布时间】:2020-11-01 03:00:02 【问题描述】:

我的问题与here 有关。我正在使用猫和狗数据集。所以只有这两种结果。我找到了两个实现。 First一用:

tf.keras.layers.Dense(1)

作为模型的最后一层 second 实现使用:

layers.Dense(2)

现在,我不明白这一点。这里什么是正确的?是否相同以及为什么(我不明白为什么应该相同)。或者这里有什么区别?第一个解决方案是为猫或狗建模,第二个解决方案是为猫、狗或其他任何人建模?如果我们只有猫和狗,为什么要这样做?我应该采取哪种解决方案?

【问题讨论】:

【参考方案1】:

两者都是正确的。一种是使用二元分类,另一种是使用分类分类。让我们试着找出不同之处。

二元分类:在这种情况下,输出层只有一个神经元。从这个单一的神经元输出中,你必须决定它是猫还是狗。您可以设置任何阈值级别来对输出进行分类。假设猫被标记为 0,狗被标记为 1,您的阈值为 0.5。因此,如果输出大于 0.5,那么它就是一只狗,因为它更接近 1,否则它就是一只猫。在这种情况下,大多数情况下都使用 binary_crossentropy。

分类分类:输出层数与类数完全相同。这次您不能将数据标记为 0 或 1。标签形状应与输出层相同。在您的情况下,您的输出层有两个神经元(用于类)。您必须以相同的方式标记数据。为此,您必须对标签数据进行编码。我们称之为“one-hot-encode”。例如,猫将被编码为 (1,0),狗将被编码为 (0,1)。现在您的预测将有两个浮点数。如果第一个数字大于第二个数字,则为猫,否则为狗。我们将这个数字称为置信度分数。假设对于测试图像,您的模型预测为 (0.70, 0.30)。这意味着您的模型有 70% 的信心认为它是猫,有 30% 的信心认为它是狗。请注意,输出层的值完全取决于您的层的激活。要深入了解,请阅读激活函数。

【讨论】:

但两者都应用于相同的数据。在分类分类的情况下,没有对标签进行进一步的操作。那么如何将这种不同的代码应用于相同的数据呢?所以在这两种实现中,数据都是用 tfds.load 加载的。或者这是在拟合模型时“隐式”完成的?而且我不用管这个/想想我想用什么? 由于 sparse_categorical_crossentropy,他们能够使用相同格式的数据。你可以看这里:***.com/questions/58565394/… 如果你只有两个类,我会推荐二进制一个。如果你有两个以上的类,你可以选择一个分类的。 感谢您的回答,但是如果标签必须采用不同的形状/编码,我仍然不明白他们如何将其应用于相同的数据。那么这是在安装时自动完成的,我不必关心这个吗?所以我指的是两个实现示例中的数据预处理步骤。 你需要知道 categorical-crossentropy 和 sparse_categorical_crossentropy 的区别。我已经在上面添加了另一个问题链接。请看一下

以上是关于在二进制分类的情况下,最后一个密集层中的单元数的主要内容,如果未能解决你的问题,请参考以下文章

使用 keras ResNet50 模型进行二进制分类的输出层

keras 中像素级二进制分类的最佳损失函数

张量流的第一个密集层中的 input_shape 错误

LightGBM(分类)中的叶子分数是多少?

[构造] aw3762. 二进制矩阵(困难模拟+分类讨论+简化代码+思维)

NN 和 CNN 的输出(最后一层)有区别吗?