Keras中的分流损失与自定义损失

2024-04-16 11:43:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Keras实现了一个完全连接的前馈网络。最初,我使用二进制交叉熵作为损失和度量,Adam优化器如下所示

adam = keras.optimizers.Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model.compile(optimizer=adam, loss='binary_crossentropy', metrics=['binary_crossentropy']) 

该模型训练效果良好。为了得到更好的结果,我想使用不同的损失函数和度量,如下所示

import keras.backend as K

def soft_bit_error_loss(yTrue, yPred):
    loss = K.pow(1 - yPred, yTrue) * K.pow(yPred, 1-yTrue)
    return K.mean(loss)

def ber(yTrue, yPred):
    x_hat_train = K.cast(K.greater(yPred, 0.5), 'uint8')
    train_errors = K.cast(K.not_equal(K.cast(yTrue, 'uint8'), x_hat_train), 'float32')
    train_ber = K.mean(train_errors)
    return train_ber

我用它来编译我的模型如下

model.compile(optimizer=adam, loss=soft_bit_error_loss, metrics=[ber])

然而,当我这样做,损失和指标发散后,一些训练,每次如下图。你知道吗

custom loss

ber

原因是什么?你知道吗


Tags: model度量trainbetakerasoptimizer损失compile
1条回答
网友
1楼 · 发布于 2024-04-16 11:43:05

你的损失函数非常不稳定,看看它:

enter image description here

为了简单起见,我用x替换了y_pred(变量),用c替换了y_true(常量)。你知道吗

当你的预测接近0时,至少有一个操作会趋向于1/0,这是无限的。虽然通过极限理论你可以知道结果是正确的,但是Keras并不知道“整体”函数是一个整体,它是根据所使用的基本运算来计算导数的。你知道吗

因此,一个简单的解决方案是@today指出的:

loss = K.switch(yTrue == 1, 1 - yPred, yPred)

它是完全相同的函数(只有当c不是0或1时才有区别)。你知道吗

而且,更简单的是,对于c=0c=1,它只是一个普通的loss='mae'。你知道吗

相关问题 更多 >