我正在编写一个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
Run Code Online (Sandbox Code Playgroud)
但上面的实现给了我错误.我怎样才能在keras中实现这一目标?
Dan*_*ler 20
我认为你正在寻找L2正规化.只需创建一个正则化器并将其添加到图层中:
from keras.regularizers import l2
#in the target layers, Dense, Conv2D, etc.:
layer = Dense(units, ..., kernel_regularizer = l2(some_coefficient))
Run Code Online (Sandbox Code Playgroud)
你也可以使用bias_regularizer.
该some_coefficientVAR是由重量的平方值相乘.
PS:如果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 = ...)
Run Code Online (Sandbox Code Playgroud)
请注意,layer_weights必须直接来自图层作为"张量",所以你不能使用get_weights(),你必须去someLayer.kernel和someLayer.bias.(或者对于可训练参数使用不同名称的图层的相应var名称).
这里的答案显示了如果你的外部变量是批量变量的,如何处理:如何定义在Keras中使用ImageDataGenerator时依赖于输入的自定义成本函数?
| 归档时间: |
|
| 查看次数: |
8526 次 |
| 最近记录: |