在训练模型的时候,Keras提供了许多损失函数供我们使用,但是即便如此,我们也会有遇到需要用自己的损失函数的情况,这样我们就要自定义一个损失函数。比如我现在需要定义一个损失函数,类似于relu函数,低于threshold的loss为0,大于threshold的loss就是他们之间的差。注意我们在定义损失函数的时候,必须可以求导。任何损失函数必须有y_true, y_pred两个参数,他们的类型为tensor。
def relu_loss(y_true, y_pred, threshold = 1):
if not K.is_tensor(y_pred):
y_pred = K.constant(y_pred)
y_true = K.cast(y_true, y_pred.dtype)
return K.sum(K.cast(K.greater(K.abs(y_pred - y_true), threshold), K.floatx()) * K.abs(y_pred - y_true))
在定义完之后,我们就可以通过名字把损失函数和指标函数给模型了。
model.compile(optimizer='rmsprop', loss=relu_loss, metrics=[relu_loss])
要注意的是,我们在重新读取模型的时候,因为我们自定义了损失函数和指标函数,所以我们在用load_model的时候,必须通过custom_objects参数声明这些函数名字代表了什么。
model = load_model('linear.model', custom_objects={'relu_loss': relu_loss})
可以看到这个损失函数在高学习率下收敛的非常快。
Epoch 10/300
8/8 [==============================] - 0s 4ms/step - loss: 0.0000e+00 - relu_loss: 0.0000e+00 - val_loss: 0.0000e+00 - val_relu_loss: 0.0000e+00
以上就是如何通过Keras自定义损失函数和指标函数了。
来源:CSDN
作者:Ziyue8764
链接:https://blog.csdn.net/wangz315/article/details/104010524