【问题标题】:Difference between Dense(2) and Dense(1) as the final layer of a binary classification CNN?Dense(2) 和 Dense(1) 作为二元分类 CNN 的最后一层的区别?
【发布时间】:2018-11-21 08:17:12
【问题描述】:

在用于图像二元分类的 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 组即可。

非常感谢!

【问题讨论】:

  • 第二个代码 sn-p 只产生常数值 1.0,不能对单个神经元使用 softmax。

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


【解决方案1】:

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

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

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

如果你只想用Dense 层生成一个值,这意味着你会得到一个形状为(None, 1) 的张量 - 所以它会生成一个数值,比如regression 任务。您正在使用输出的值来表示类别。答案是正确的,但不像classification任务的一般解决方案那样执行。

【讨论】:

  • 您知道为什么文档 (keras.io/getting-started/sequential-model-guide) 建议相反的方式(只有一个输出)吗?对我来说,如果我使用具有一个输出维度和binary_crossentropy 的最终密集层,或者使用具有两个输出维度和sparse_categorical_crossentropy 的最终密集层,它的工作原理是一样的。
  • @KLaz 其实我们在做分类任务的时候,会根据分类类别的个数来选择损失函数。在Keras中,如果我们想做一个二分类,我们通常使用Dense(1, activation='sigmoid', name='output')作为最后一个节点,我们会编译模型使用binary_crossentropy损失函数。但是当我们要做一个多类分类任务时,我们选择Dense(4, activation='softmax', name='output')作为输出节点,相应地我们选择categorical_crossentropy作为损失函数。
  • @KLaz 我认为这可能只是一种习惯,因为它可以产生相同的结果。
  • @NeoXu,我有 2 类疾病分类(X 和非 X),我在最后一个密集层使用了 2,sigmoid 之后激活。对于损失我使用了mean_squared_error。在此之前,训练和测试标签被转换为to_categorical。你认为这是正确的吗?或者我根本不应该转换 to_categorical 并在密集中使用 1,之后使用 sigmoidbinary_crossentropy 作为损失?
【解决方案2】:

不同之处在于类概率是否相互独立(多标签分类)。

当有 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,则它是正确的实现。多标签分类就是这种情况,其中一个实例可能属于多个正确的类。

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2022-01-10
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多