我如何指定损失函数为keras中的二次加权kappa



我的理解是,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(...)

相关内容

  • 没有找到相关文章

最新更新