使用 keras,我必须训练一个模型来预测图像属于 0 类还是 1 类。我对二进制和 categorical_cross_entropy 感到困惑。我已经搜索过了,但我仍然很困惑。有人提到,当我们尝试预测多类时,我们仅使用分类交叉熵,并且我们应该为此使用 one-hot-encoder 向量。因此,这意味着当我们使用binary_cross_entrpoy进行训练时,我们不需要任何one-hot编码的向量标签。有些人建议将 one_hot 向量表示为 [0. 1.](如果类别为 1)或 [1. 0.](如果类别为 0)用于 binary_cross_entropy。 我正在使用带有分类交叉熵的热编码器 [0 1] 或 [1 0]。我的最后一层是
model.add(Dense(num_classes, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy',
optimizer='adadelta',
metrics=['accuracy'])
对于 2 个类别,它们在数学上是相同的,因此是二进制的。换句话说,2 类分类交叉熵与单输出二元交叉熵相同。举一个更具体的例子,它们是相同的:
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', ...)
# is the same as
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', ...)
使用哪一个?为了避免单热编码分类输出,如果只有 2 个类,从编码的角度来看,使用二进制交叉熵会更容易。根据实现的不同,二进制情况可能在计算上更有效。
似乎,二元交叉熵只是分类交叉熵的一个特例。因此,当你只有两个类时,你可以使用二进制交叉熵,你不需要做一个热编码 - 你的代码将减少几行。
BCE 和 CE 损失之间的区别之一(如果有 2 个类别)是数学上的 CE 损失仅惩罚负责预测真实类别 (y_i log(y_hat_i)) 的神经元,并让 softmax 函数生成 logits互斥的,而在单神经元 BCE 损失中,惩罚预测以使其收敛到真实分布隐式地使特征表示与其他类别不同,因此损失函数使两个类别互斥。