Tensorflow 作为二元分类的最后一层,稠密(2)和稠密(1)之间的区别是什么?
在用于图像二值分类的CNN中,输出的形状应该是(图像数量1)还是(图像数量2)?具体来说,这里有两种CNN中的最后一层:Tensorflow 作为二元分类的最后一层,稠密(2)和稠密(1)之间的区别是什么?,tensorflow,keras,deep-learning,classification,convolutional-neural-network,Tensorflow,Keras,Deep Learning,Classification,Convolutional Neural Network,在用于图像二值分类的CNN中,输出的形状应该是(图像数量1)还是(图像数量2)?具体来说,这里有两种CNN中的最后一层: keras.layers.Dense(2, activation = 'softmax')(previousLayer) 或 在第一种情况下,对于每个图像有2个输出值(属于组1的概率和属于组2的概率)。在第二种情况下,每个图像只有一个输出值,即其标签(0或1,label=1表示它属于组1) 哪一个是正确的?有内在的区别吗?我不想识别这些图像中的任何对象,只需将它们分成两组
keras.layers.Dense(2, activation = 'softmax')(previousLayer)
或
在第一种情况下,对于每个图像有2个输出值(属于组1的概率和属于组2的概率)。在第二种情况下,每个图像只有一个输出值,即其标签(0或1,label=1表示它属于组1)
哪一个是正确的?有内在的区别吗?我不想识别这些图像中的任何对象,只需将它们分成两组
非常感谢 第一个是正确的解决方案:
keras.layers.Dense(2, activation = 'softmax')(previousLayer)
通常,我们使用softmax
激活功能来执行分类任务,输出宽度将是类别的数量。这意味着,如果要使用标签A
、B
或C
将一个对象分为三类,则需要使稠密层生成形状为(无,3)
的输出。然后,您可以使用交叉熵
损失函数来计算损失
,自动计算梯度,并执行反向传播过程
如果您只想在稠密
层中生成一个值,这意味着您将得到一个形状为(None,1)
-的张量,因此它会生成一个数值,就像回归
任务一样。您正在使用输出的值来表示类别。答案是正确的,但与分类任务的一般解决方案不同。区别在于类别概率是否相互独立(多标签分类)
当有两个类时,通常有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
。这是多标签分类的情况,其中一个实例可能属于多个正确的类。第二个代码段仅产生常量值1.0,不能将softmax与单个神经元一起使用。您知道为什么文档()建议相反的方式(仅一个输出)?。对我来说,如果我使用一个输出维度的最终密集层,然后使用二进制交叉熵
,或者使用两个输出维度的最终密集层,然后使用稀疏分类交叉熵
@KLaz实际上,当我们想做分类任务时,我们将根据分类类别的数量选择损失函数。在Keras中,如果我们想进行两类分类,我们通常使用Dense(1,activation='sigmoid',name='output')
作为最后一个节点,我们将使用二进制交叉熵
损失函数编译模型。但是当我们想做一个多类分类任务时,我们选择Dense(4,activation='softmax',name='output')
作为输出节点,相应地我们选择category_crossentropy
作为损失函数。@KLaz我想做这个任务可能只是一种习惯,因为它可以产生相同的结果。@NeoXu,我有两种疾病分类(X和非X),我在最后一个致密层中使用了2种,之后激活了sigmoid
。对于损失,我使用了mean_squared_error
。在此之前,列车和测试标签被转换为分类标签。你认为这是正确的做法吗?或者我根本不应该将转换为_category
,然后在稠密的sigmoid
中使用1,binary\u crossentropy
作为损失?
keras.layers.Dense(2, activation = 'sigmoid')