密集(2)和密集(1)之间的差异作为二元分类CNN的最后一层?

时间:2018-06-12 02:50:40

标签: tensorflow keras deep-learning classification convolutional-neural-network

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

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

keras.layers.Dense(1, activation = 'softmax')(previousLayer)

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

哪一个是正确的?有内在差异吗?我不想识别这些图像中的任何对象,只需将它们分成两组。

非常感谢!

2 个答案:

答案 0 :(得分:4)

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

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

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

如果您只希望使用Dense图层生成一个值,则表示您获得形状为(None, 1)的张量 - 因此它会生成单个数值,如{{1}任务。您正在使用输出的值来表示类别。答案是正确的,但不像regression任务的一般解决方案那样执行。

答案 1 :(得分:4)

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

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

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

keras.layers.Dense(1, activation = 'sigmoid')
两者在类概率方面都是正确的。唯一的区别是您在训练期间如何提供标签。但是

keras.layers.Dense(2, activation = 'sigmoid')
在这种情况下,

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