Keras中的自定义损失函数和输出精度不正确

时间:2018-08-16 10:21:58

标签: python tensorflow keras

当我按如下所示制作自定义损失函数时:(与binary_crossentropy相同)

def custom_loss(y_true, y_pred):
    ce = K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)
    return ce

在keras / keras / losses.py中,binary_crossentropy是:

def binary_crossentropy(y_true, y_pred):
    return K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)

当我跑步时:

model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])

输出正确。

ETA: 6:20 - loss: 0.3697 - acc: 0.8343

如果我使用custom_loss:

model.compile(loss=custom_loss, optimizer=optimizer, metrics=['accuracy'])

输出不正确:

ETA: 10:49 - loss: 0.7651 - acc: 0.0694

我们可以看到准确性不正确。为什么?

1 个答案:

答案 0 :(得分:1)

这是因为loss="binary_crossentropy"和自定义损失函数之间的精度不相同。

如果您设置loss='binary_crossentropy',则指标"acc"'binary_accuracy'相同。 但是您将自定义损失函数设置为代码,与'categorical_accuracy'相同。

def binary_accuracy(y_true, y_pred):
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)


def categorical_accuracy(y_true, y_pred):
    return K.cast(K.equal(K.argmax(y_true, axis=-1),
                          K.argmax(y_pred, axis=-1)),
                  K.floatx())

因此,如果您获得相同的acc值,则可以在指标数组中指定keras.metrics.binary_accuracy。

from keras.metrics import binary_accuracy

model.compile(loss=custom_loss,
              metrics=[binary_accuracy])