我正在对具有2个输出的分类器使用非线性损失函数。第一个损失为binary_crossentropy()
,第二个损失被加权为(1+LAM*stds)
,其中stds
是模型的第二个输出。
我发现,即使"binary_crossentropy"
设置为0,具有1个输出和LAM
损失的模型的性能也比我的模型好。在这种情况下,两个模型应该具有相同的性能,但是总是更糟。
有什么区别?
def weightedBCE(y_true, y_pred):
assert y_pred.shape[1] == 2
y_pred_val = y_pred[:,0]
stds = y_pred[:,1]
bce = K.binary_crossentropy(y_true[:,0], y_pred_val)
loss = bce * (1. + LAM*stds )
return loss
当我进行此训练时,我使用如下输出:
model.predict([X_test1, X_test2, X_test3])[:,0]
对于标准模型,我这样做:
model.predict([X_test1, X_test2, X_test3])
编辑: 当我有2个分类器输出时,我做了一个简单的测试,但是损失仅应用于其中一个:
def weightedBCE(y_true, y_pred):
return K.mean(K.binary_crossentropy(y_true[:,0], y_pred[:,0]), axis=-1)
它仍然无法像我只有1条损失的输出那样提供相同的结果:
def BCE(y_true, y_pred):
bce = K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)
return bce