我正在编写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中实现这一点
您可以通过使用
lambda
操作符以另一种方式执行此操作,如下所示:model.compile(loss= [lambda y_true,y_pred: Custom_loss(y_true, y_pred, val=0.01)], optimizer =...)
以这种方式保存和加载模型存在一些问题。解决方法是只保存权重并使用
model.load_weights(...)
新答案
我想你正在寻找L2正则化。只需创建一个正则化器并将其添加到层中:
您也可以使用
bias_regularizer
。some_coefficient
变量乘以权重的平方值PS:如果代码中的
val
是常量,它不应该损害您的损失。但是您仍然可以使用下面的旧答案来表示val
旧答案
根据您的需要将Keras预期函数(带两个参数)包装到外部函数中:
注意
layer_weights
必须作为“张量”直接来自层,因此不能使用get_weights()
,必须使用someLayer.kernel
和someLayer.bias
。(如果层的可训练参数使用不同的名称,则为相应的var名称)这里的答案显示了如果外部变量随批处理而变,如何处理此问题:How to define custom cost function that depends on input when using ImageDataGenerator in Keras?
相关问题 更多 >
编程相关推荐