分类交叉熵和二进制交叉熵之间的差异

时间:2018-10-24 09:36:45

标签: python tensorflow machine-learning keras computer-vision

使用keras,我必须训练一个模型来预测图像属于0类还是1类。我对二进制和categorical_cross_entropy感到困惑。我已经搜索过了,但仍然感到困惑。有人提到,当我们尝试预测多类时,我们仅使用分类交叉熵,为此,我们应该使用单热编码器矢量。因此,这意味着当我们要使用binary_cross_entrpoy进行训练时,不需要任何热编码的矢量标签。有人建议将one_hot向量表示为[0。 1。](如果class为1)或[1。 0。](如果class为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 个答案:

答案 0 :(得分:2)

在数学上,它们对于 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个类,则从编码角度来看,使用二进制交叉熵比较容易。根据实现的不同,二进制情况在计算上可能更有效。

答案 1 :(得分:1)

似乎,二进制交叉熵只是分类交叉熵的特例。因此,当您只有两个类时,可以使用二进制交叉熵,而无需进行一种热编码-您的代码将少两行