我的理解是,keras要求损失函数具有签名:
-I
我正在尝试使用def custom_loss(y_true, y_pred):
,这需要
(y1,y2,标签=无,权重=无,sample_weight =无)`
如果按原样使用它:
sklearn.metrics.cohen_kappa_score
然后将不会设置model.compile(loss=metrics.cohen_kappa_score,
optimizer='adam', metrics=['accuracy'])
。我想将其设置为weights
。有什么要传递的吗?
答案 0 :(得分:4)
您可以将其定义为自定义损失,是的,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(...)
答案 1 :(得分:1)
在Keras中实现参数化的自定义损失函数(cohen_kappa_score
)有两个步骤。由于已经实现了满足您需要的功能,因此您无需自己实现它。但是,根据TensorFlow Documentation,sklearn.metrics.cohen_kappa_score
不支持加权矩阵。
因此,我建议TensorFlow的cohen_kappa实现。但是,在Keras中使用TensorFlow并非易事...
根据此Question,他们使用control_dependencies
在Keras中使用TensorFlow指标。这是一个示例:
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 loss functions以(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用作损失函数。这是paper,使用加权kappa作为损失函数进行多类分类。