在用于图像二进制分类的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)。
哪一个是正确的?有内在差异吗?我不想识别这些图像中的任何对象,只需将它们分成两组。
非常感谢!
答案 0 :(得分:4)
第一个是正确的解决方案:
keras.layers.Dense(2, activation = 'softmax')(previousLayer)
通常,我们使用softmax
激活函数来执行分类任务,输出宽度将是类别的数量。这意味着,如果您要将一个对象分为三个类别,并使用标签A
,B
或C
,则需要使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
,则它是正确的实现。多标签分类就是这种情况,其中一个实例可能属于多个正确的类。