Keras自定义丢失函数,用于传递y_true和y_pred以外的参数

时间:2017-10-20 22:10:55

标签: keras

我正在编写一个keras自定义丢失函数,其中我想传递给以下函数: y_true,y_pred(无论如何都会自动传递这两个),模型内部图层的权重和常量。

如下所示:

def Custom_loss(y_true, y_pred, layer_weights, val = 0.01):
    loss = mse(y_true, y_pred)
    loss += K.sum(val, K.abs(K.sum(K.square(layer_weights), axis=1)))
    return loss

但是上面的实现给了我错误。 我怎样才能在keras中实现这一目标?

2 个答案:

答案 0 :(得分:15)

新答案

我认为你正在寻找L2正规化。只需创建一个正则化器并将其添加到图层中:

fromValue

您也可以使用toValue from keras.regularizers import l2 #in the target layers, Dense, Conv2D, etc.: layer = Dense(units, ..., kernel_regularizer = l2(some_coefficient)) var乘以权重的平方值。

PS:如果代码中的bias_regularizer不变,则不应该损害您的损失。但您仍然可以使用下面的旧答案some_coefficient

旧答案

根据您的需要将Keras预期功能(带有两个参数)包装到外部功能中:

val

请注意,val必须直接来自图层作为"张贴",因此您无法使用def customLoss(layer_weights, val = 0.01): def lossFunction(y_true,y_pred): loss = mse(y_true, y_pred) loss += K.sum(val, K.abs(K.sum(K.square(layer_weights), axis=1))) return loss return lossFunction model.compile(loss=customLoss(weights,0.03), optimizer =..., metrics = ...) ,您必须使用layer_weightsget_weights()。 (或者对于可训练参数使用不同名称的图层的相应var名称)。

这里的答案显示了如果您的外部变量随批次变化而如何处理:How to define custom cost function that depends on input when using ImageDataGenerator in Keras?

答案 1 :(得分:0)

您可以使用lambda运算符以另一种方式执行此操作:

model.compile(loss= [lambda y_true,y_pred: Custom_loss(y_true, y_pred, val=0.01)], optimizer =...)

关于以这种方式保存和加载模型存在一些问题。一种解决方法是仅保存权重并使用model.load_weights(...)