【问题标题】:How to define a custom accuracy in Keras to ignore samples with a particular gold label?如何在 Keras 中定义自定义精度以忽略带有特定金标签的样本?
【发布时间】:2017-11-13 18:02:23
【问题描述】:

我想在 Keras 中编写一个自定义指标(我使用的是 tensorflow 后端),相当于categorical_accuracy,但是必须忽略具有特定黄金标签的样本的输出(在我的情况下为 0,来自 y_true) .例如,如果我的输出是:

Pred 1 - Gold 0

Pred 1 - Gold 1

准确度为 1,因为必须忽略带有金色标签 0 的样本。也就是说,我编写的函数(并没有给出预期的结果)是:

def my_accuracy(y_true, y_pred):

    mask = K.any(K.not_equal(K.argmax(y_true, axis=-1), 0), axis=-1, keepdims=True)

    masked_y_true = y_true*K.cast(mask, K.dtype(y_true))
    masked_y_pred = y_pred*K.cast(mask, K.dtype(y_pred))

    return keras.metrics.categorical_accuracy(masked_y_true, masked_y_pred)`

感谢任何帮助,谢谢!

【问题讨论】:

    标签: tensorflow keras metrics


    【解决方案1】:

    你可以试试这个方法:

    def ignore_accuracy_of_class(class_to_ignore=0):
        def ignore_acc(y_true, y_pred):
            y_true_class = K.argmax(y_true, axis=-1)
            y_pred_class = K.argmax(y_pred, axis=-1)
    
            ignore_mask = K.cast(K.not_equal(y_pred_class, class_to_ignore), 'int32')
            matches = K.cast(K.equal(y_true_class, y_pred_class), 'int32') * ignore_mask
            accuracy = K.sum(matches) / K.maximum(K.sum(ignore_mask), 1)
            return accuracy
    
        return ignore_acc
    

    【讨论】:

      【解决方案2】:

      根据@RKO 的回复,这里是 TensorFlow 2.0 版本

      import tensorflow.keras as K
      def ignore_acc(y_true_class, y_pred_class, class_to_ignore=0):
          ignore_mask = K.backend.cast(K.backend.not_equal(y_pred_class, class_to_ignore), 'int32')
          matches = K.backend.cast(K.backend.equal(y_true_class, y_pred_class), 'int32') * ignore_mask
          accuracy = K.backend.sum(matches) / K.backend.maximum(K.backend.sum(ignore_mask), 1)
          return accuracy.numpy()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-06
        • 2017-12-15
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        相关资源
        最近更新 更多