在我的神经网络中,如果我用以下代码编译它:
D.compile(loss="binary_crossentropy", optimizer=opt_D)
它的效果很好,但如果我这样做:
def make_loss_D(c):
def loss_D(y_true, y_pred):
#return c * K.binary_crossentropy(y_pred, y_true)
return c * K.mean (K.binary_crossentropy(y_pred, y_true))
return loss_D
D.compile(loss=[make_loss_D(c=1.0)], optimizer=opt_D)
损失完全不同,神经网络的预测非常强,接近1或0。
我喜欢第一个例子中看到的行为,但在深入研究https://github.com/keras-team/keras/blob/master/keras/losses.py代码后,我不明白为什么两者会如此不同。在我的代码中调整c
的值以使第一个纪元后的两个损失匹配根本没有帮助。
定义的损失有何不同,为什么第二个损失如此严重?
编辑:
在修改y_pred
,y_true
和轴的平均值后,自定义函数也可以使用。
def make_loss_D(c):
def loss_D(y_true, y_pred):
return c * K.mean (K.binary_crossentropy(y_true, y_pred), axis=-1)
return loss_D
损失仍然不一样,原因可能是什么?