How to calculate precision and recall in Keras

后端 未结 5 605
别跟我提以往
别跟我提以往 2020-12-13 03:47

I am building a multi-class classifier with Keras 2.02 (with Tensorflow backend),and I do not know how to calculate precision and recall in Keras. Please help me.

5条回答
  •  一生所求
    2020-12-13 04:32

    This thread is a little stale, but just in case it'll help someone landing here. If you are willing to upgrade to Keras v2.1.6, there has been a lot of work on getting stateful metrics to work though there seems to be more work that is being done (https://github.com/keras-team/keras/pull/9446).

    Anyway, I found the best way to integrate precision/recall was using the custom metric that subclasses Layer, shown by example in BinaryTruePositives.

    For recall, this would look like:

    class Recall(keras.layers.Layer):
        """Stateful Metric to count the total recall over all batches.
    
        Assumes predictions and targets of shape `(samples, 1)`.
    
        # Arguments
            name: String, name for the metric.
        """
    
        def __init__(self, name='recall', **kwargs):
            super(Recall, self).__init__(name=name, **kwargs)
            self.stateful = True
    
            self.recall = K.variable(value=0.0, dtype='float32')
            self.true_positives = K.variable(value=0, dtype='int32')
            self.false_negatives = K.variable(value=0, dtype='int32')
        def reset_states(self):
            K.set_value(self.recall, 0.0)
            K.set_value(self.true_positives, 0)
            K.set_value(self.false_negatives, 0)
    
        def __call__(self, y_true, y_pred):
            """Computes the number of true positives in a batch.
    
            # Arguments
                y_true: Tensor, batch_wise labels
                y_pred: Tensor, batch_wise predictions
    
            # Returns
                The total number of true positives seen this epoch at the
                    completion of the batch.
            """
            y_true = K.cast(y_true, 'int32')
            y_pred = K.cast(K.round(y_pred), 'int32')
    
            # False negative calculations
            y_true = K.cast(y_true, 'int32')
            y_pred = K.cast(K.round(y_pred), 'int32')
            false_neg = K.cast(K.sum(K.cast(K.greater(y_pred, y_true), 'int32')), 'int32')
            current_false_neg = self.false_negatives * 1
            self.add_update(K.update_add(self.false_negatives,
                                         false_neg),
                            inputs=[y_true, y_pred])
            # True positive  calculations
            correct_preds = K.cast(K.equal(y_pred, y_true), 'int32')
            true_pos = K.cast(K.sum(correct_preds * y_true), 'int32')
            current_true_pos = self.true_positives * 1
            self.add_update(K.update_add(self.true_positives,
                                         true_pos),
                            inputs=[y_true, y_pred])
            # Combine
            recall = (K.cast(self.true_positives, 'float32') / (K.cast(self.true_positives, 'float32') + K.cast(self.false_negatives, 'float32') + K.cast(K.epsilon(), 'float32')))
            self.add_update(K.update(self.recall,
                                         recall),
                            inputs=[y_true, y_pred])
    
            return recall   
    

提交回复
热议问题