我的理解是,keras需要损失功能才能具有签名:
def custom_loss(y_true, y_pred):
我正在尝试使用sklearn.metrics.cohen_kappa_score
,(y1,y2,labels = none,weights = none,sample_weight = none)`
如果我按原样使用它:
model.compile(loss=metrics.cohen_kappa_score,
optimizer='adam', metrics=['accuracy'])
则不会设置weights
。我想将其设置为quadtratic
。有什么可以通过的吗?
在Keras中实现参数化的自定义损失功能(cohen_kappa_score
)有两个步骤。由于有您需要的实施功能,因此您无需自己实施它。但是,根据TensorFlow文档,sklearn.metrics.cohen_kappa_score
不支持加权矩阵。因此,我建议Tensorflow对Cohen_kappa的实现。但是,在Keras中使用TensorFlow并不容易...根据这个问题,他们使用control_dependencies
在Keras中使用张量指标。这是一个示例:
import keras.backend as K
def _cohen_kappa(y_true, y_pred, num_classes, weights=None, metrics_collections=None, updates_collections=None, name=None):
kappa, update_op = tf.contrib.metrics.cohen_kappa(y_true, y_pred, num_classes, weights, metrics_collections, updates_collections, name)
K.get_session().run(tf.local_variables_initializer())
with tf.control_dependencies([update_op]):
kappa = tf.identity(kappa)
return kappa
由于KERAS损耗功能以(y_true, y_pred)
为参数,因此您需要一个返回另一个功能的包装函数。这是一些代码:
def cohen_kappa_loss(num_classes, weights=None, metrics_collections=None, updates_collections=None, name=None):
def cohen_kappa(y_true, y_pred):
return -_cohen_kappa(y_true, y_pred, num_classes, weights, metrics_collections, updates_collections, name)
return cohen_kappa
最后,您可以在Keras中使用如下:
# get the loss function and set parameters
model_cohen_kappa = cohen_kappa_loss(num_classes=3,weights=weights)
# compile model
model.compile(loss=model_cohen_kappa,
optimizer='adam', metrics=['accuracy'])
使用Cohen-kappa度量作为损失函数。通常,可以将加权kappa用作损失函数。这是使用加权kappa作为多类分类的损失函数的论文。
您可以将其定义为自定义损失,是的,您是正确的,keras
在损失函数中仅接受两个参数。这是您可以定义损失的方法:
def get_cohen_kappa(weights=None):
def cohen_kappa_score(y_true, y_pred):
"""
Define your code here. You can now use `weights` directly
in this function
"""
return score
return cohen_kappa_score
现在您可以将此功能传递给您的模型:
model.compile(loss=get_cohen_kappa_score(weights=weights),
optimizer='adam')
model.fit(...)