我正在编写一个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中实现这一目标?
答案 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_weights
和get_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(...)