Keras实例:自定义损失函数/指标函数

随声附和 提交于 2020-01-19 12:11:48

在训练模型的时候,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自定义损失函数和指标函数了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!