Dense(2) 和 Dense(1) 作为二进制分类 CNN 的最后一层之间的区别?
Difference between Dense(2) and Dense(1) as the final layer of a binary classification CNN?
在用于图像二值分类的 CNN 中,输出的形状应该是(图像数量,1)还是(图像数量,2)?具体来说,这里有两种 CNN 中的最后一层:
keras.layers.Dense(2, activation = 'softmax')(previousLayer)
或
keras.layers.Dense(1, activation = 'softmax')(previousLayer)
在第一种情况下,对于每个图像都有 2 个输出值(属于第 1 组的概率和属于第 2 组的概率)。第二种情况,每张图片只有1个输出值,就是它的label(0或1,label=1表示属于第1组)。
哪个是正确的?有本质区别吗?我不想识别那些图像中的任何对象,只需将它们分成 2 组。
非常感谢!
第一个是正确的解决方案:
keras.layers.Dense(2, activation = 'softmax')(previousLayer)
通常我们使用softmax
激活函数做分类任务,输出的宽度就是类别的个数。这意味着如果你想用标签A
、B
或C
将一个对象分为三类,你需要让Dense
层生成一个输出形状为 (None, 3)
。然后可以使用cross_entropy
loss函数计算LOSS
,自动计算梯度,做反向传播过程。
如果你只想用 Dense
层生成一个值,这意味着你得到一个形状为 (None, 1)
的张量 - 所以它会生成一个单一的数值,如 regression
任务。您正在使用输出值来表示类别。答案是正确的,但不像 classification
任务的一般解决方案那样执行。
不同之处在于 class 概率是否相互独立(多标签 class化)。
当有 2 个 class 并且你通常有 P(c=1) + P(c=0) = 1
那么
keras.layers.Dense(2, activation = 'softmax')
keras.layers.Dense(1, activation = 'sigmoid')
两者的 class 概率都是正确的。唯一的区别是您在训练期间如何提供标签。但是
keras.layers.Dense(2, activation = 'sigmoid')
在这种情况下是不正确的。但是,如果您有 P(c=1) + P(c=0) != 1
,这是正确的实现。这是多标签 classification 的情况,其中一个实例可能属于多个正确的 class.
在用于图像二值分类的 CNN 中,输出的形状应该是(图像数量,1)还是(图像数量,2)?具体来说,这里有两种 CNN 中的最后一层:
keras.layers.Dense(2, activation = 'softmax')(previousLayer)
或
keras.layers.Dense(1, activation = 'softmax')(previousLayer)
在第一种情况下,对于每个图像都有 2 个输出值(属于第 1 组的概率和属于第 2 组的概率)。第二种情况,每张图片只有1个输出值,就是它的label(0或1,label=1表示属于第1组)。
哪个是正确的?有本质区别吗?我不想识别那些图像中的任何对象,只需将它们分成 2 组。
非常感谢!
第一个是正确的解决方案:
keras.layers.Dense(2, activation = 'softmax')(previousLayer)
通常我们使用softmax
激活函数做分类任务,输出的宽度就是类别的个数。这意味着如果你想用标签A
、B
或C
将一个对象分为三类,你需要让Dense
层生成一个输出形状为 (None, 3)
。然后可以使用cross_entropy
loss函数计算LOSS
,自动计算梯度,做反向传播过程。
如果你只想用 Dense
层生成一个值,这意味着你得到一个形状为 (None, 1)
的张量 - 所以它会生成一个单一的数值,如 regression
任务。您正在使用输出值来表示类别。答案是正确的,但不像 classification
任务的一般解决方案那样执行。
不同之处在于 class 概率是否相互独立(多标签 class化)。
当有 2 个 class 并且你通常有 P(c=1) + P(c=0) = 1
那么
keras.layers.Dense(2, activation = 'softmax')
keras.layers.Dense(1, activation = 'sigmoid')
两者的 class 概率都是正确的。唯一的区别是您在训练期间如何提供标签。但是
keras.layers.Dense(2, activation = 'sigmoid')
在这种情况下是不正确的。但是,如果您有 P(c=1) + P(c=0) != 1
,这是正确的实现。这是多标签 classification 的情况,其中一个实例可能属于多个正确的 class.