新答案
我认为你正在寻找 L2 正则化。只需创建一个正则化器并将其添加到图层中即可:
from keras.regularizers import l2
#in the target layers, Dense, Conv2D, etc.:
layer = Dense(units, ..., kernel_regularizer = l2(some_coefficient))
您可以使用bias_regularizer
以及。
The some_coefficient
var 乘以权重的平方值。
PS: if val
在你的代码中是不变的,它不应该损害你的损失。但您仍然可以使用下面的旧答案val
.
旧答案
根据您的需求将 Keras 预期函数(带有两个参数)包装到外部函数中:
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()
,你必须去someLayer.kernel
and someLayer.bias
。 (或者在层使用不同名称作为可训练参数的情况下相应的变量名称)。
这里的答案显示了如果您的外部变量随批次变化的情况如何处理:在 Keras 中使用 ImageDataGenerator 时如何定义依赖于输入的自定义成本函数? https://stackoverflow.com/questions/50706160/how-to-define-custom-cost-function-that-depends-on-input-when-using-imagedatagen/50707473#50707473