keras icon indicating copy to clipboard operation
keras copied to clipboard

Tendorflow metric per class issue

Open EdouardDKP opened this issue 1 year ago • 2 comments

With Tensorflow 2.9 on Ubuntu 18.04, to evaluate the ai model performance per class, I would like to calculate the Accuracy per class. But during training, the metric value is the same for all classes. But this common value is different from each class accuracy value when I run the training with only one output metric. I have tested independently my custom metric function and it provides different values for each class. Consequently, I am guessing there is a memory share. Could you advise how I can modify my code ? Do you have any advise ? Thanks

In the File A :

[class_metrics = MetricsPerClass(classes=self.classes) metrics_list = list(class_metrics.metrics_dict.values()) metrics = self.segmentation_metricloss_prefixe_name: metrics_list}] In file B :

class MetricsPerClass(tf.keras.metrics.Metric): def init(self, name='MetricsPerClass', classes=["Class1", "Class2", "Class3", "Class4", "Class5", "Class6", "Class7"], **kwargs):

    super(MetricsPerClass, self).__init__(name=name, **kwargs)
    self.classes = classes
    
    for i, _ in enumerate(self.classes):
        name = self.classes[i]
        self.metrics_dict[name] = tf.keras.metrics.Accuracy(name=name)
    

def reset_states(self):
    for metric in self.metrics_dict.values():
        metric.reset_states()

def update_state(self, y_true, y_pred):
    lbls = tf.argmax(tf.reshape(y_true, [-1, len(self.classes)]), 1)
    preds = tf.argmax(tf.reshape(y_pred, [-1, len(self.classes)]), 1)
    for i, class_name in enumerate(self.classes):
        in_c = tf.equal(lbls, i)
    
        with tf.name_scope(class_name):
            class_metric_acc = tf.keras.metrics.Accuracy(lbls, preds, name=class_name, sample_weight=in_c)
            self.metrics_dict[class_name] = class_metric_acc
    
def result(self):
    results = {}
    for name, metric in self.metrics_dict.items():
         results[name] = metric.result().numpy()
    return results

EdouardDKP avatar Feb 05 '24 07:02 EdouardDKP

Could you pease provide sample reproducible code? Since you're using older TensorfFlow version, could you please update it to the latest version and try again. You can use Keras 3 to import keras directly. For more details, visit https://keras.io/guides/migrating_to_keras_3/

sachinprasadhs avatar Feb 07 '24 21:02 sachinprasadhs

This issue is stale because it has been open for 14 days with no activity. It will be closed if no further activity occurs. Thank you.

github-actions[bot] avatar Feb 22 '24 01:02 github-actions[bot]

This issue was closed because it has been inactive for 28 days. Please reopen if you'd like to work on this further.

github-actions[bot] avatar Mar 08 '24 01:03 github-actions[bot]

Are you satisfied with the resolution of your issue? Yes No

google-ml-butler[bot] avatar Mar 08 '24 01:03 google-ml-butler[bot]