Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 作为二元分类的最后一层,稠密(2)和稠密(1)之间的区别是什么?_Tensorflow_Keras_Deep Learning_Classification_Convolutional Neural Network - Fatal编程技术网

Tensorflow 作为二元分类的最后一层,稠密(2)和稠密(1)之间的区别是什么?

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) 哪一个是正确的?有内在的区别吗?我不想识别这些图像中的任何对象,只需将它们分成两组

在用于图像二值分类的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)
通常,我们使用
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')