Dense(2)和Dense(1)之间的区别是二进制分类CNN的最后一层?

Bub*_*ubo 8 classification deep-learning keras tensorflow convolutional-neural-network

在用于图像的二进制分类的CNN中,输出的形状应该是(图像数量1)还是(图像数量2)?具体来说,这是CNN中的2种最后一层:

keras.layers.Dense(2, activation = 'softmax')(previousLayer)
Run Code Online (Sandbox Code Playgroud)

要么

keras.layers.Dense(1, activation = 'softmax')(previousLayer)
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,每个图像都有2个输出值(属于组1的概率和属于组2的概率)。在第二种情况下,每个图像只有1个输出值,即它的标签(0或1,label = 1表示它属于组1)。

哪一个是正确的?有内在的区别吗?我不想识别这些图像中的任何对象,只需将它们分为2组即可。

非常感谢!

Raj*_*esh 7

区别在于类概率是否相互独立(多标签分类)。

当有 2 个班级并且您通常P(c=1) + P(c=0) = 1有时

keras.layers.Dense(2, activation = 'softmax') 

keras.layers.Dense(1, activation = 'sigmoid')
Run Code Online (Sandbox Code Playgroud)

就类别概率而言,两者都是正确的。唯一的区别是您在训练期间如何提供标签。但

keras.layers.Dense(2, activation = 'sigmoid')
Run Code Online (Sandbox Code Playgroud)

在这种情况下是不正确的。但是,如果您有P(c=1) + P(c=0) != 1. 这是多标签分类的情况,其中一个实例可能属于多个正确的类别。


Neo*_* Xu 5

第一个是正确的解决方案:

keras.layers.Dense(2, activation = 'softmax')(previousLayer)
Run Code Online (Sandbox Code Playgroud)

通常,我们使用softmax激活函数执行分类任务,输出宽度将为类别的数量。这意味着,如果你想一个对象分为三类有标签AB或者C,你需要使Dense层生成的形状输出(None, 3)。然后,您可以使用cross_entropy损失函数计算LOSS,自动计算梯度,然后执行反向传播过程。

如果只想在Dense图层上生成一个值,则意味着您将获得形状为(None, 1)- 的张量,因此它会生成单个数值,例如regression任务。您正在使用输出的值来表示类别。答案是正确的,但其执行效果不像classification任务的一般解决方案。

  • 您知道为什么文档(https://keras.io/getting-started/sequential-model-guide/)提出了相反的方法(仅一个输出)吗?对我来说,如果我使用具有一个输出维的最终密集层,然后使用“ binary_crossentropy”,或具有两个输出维和“ sparse_categorical_crossentropy”的最终密集层,则其工作原理相同。 (3认同)
  • @KLaz实际上,当我们要执行分类任务时,我们将基于分类类别的数量来选择损失函数。在Keras中,如果要进行“两类分类” **,我们通常使用`Dense(1,activation ='sigmoid',name ='output')`作为最后一个节点,然后编译Model使用Binary_crossentropy损失函数。但是,当我们要执行多类分类任务时,我们选择`Dense(4,activation ='softmax',name ='output')`作为输出节点,并相应地选择`categorical_crossentropy`作为损失函数。 (3认同)