Tensorflow 如何使用张量流一次计算准确度、召回率、f1分数、准确度和混淆矩阵

Tensorflow 如何使用张量流一次计算准确度、召回率、f1分数、准确度和混淆矩阵,tensorflow,deep-learning,conv-neural-network,Tensorflow,Deep Learning,Conv Neural Network,我曾尝试按如下方式计算这些指标,但我不确定是否所有这些指标都是一次性计算的 看起来这些指标都是通过单独运行模型计算的 注:“一次性”我指的是只测试一次模型,以计算所有这些指标 我有两个问题: 首先,我想知道我是否正确计算了所有这些指标(不管是否有一个短的),如果没有,请在这里指出我的错误 如果这些指标计算正确,那么如何在短时间内计算它们 如何解释混淆矩阵输出 示例:这是使用CNN模型的分类问题。它们试图对符号信号(0、1、2、3、4、5)进行分类。班级总数为6人 代码: 对于多类分类,您可

我曾尝试按如下方式计算这些指标,但我不确定是否所有这些指标都是一次性计算的

看起来这些指标都是通过单独运行模型计算的

注:“一次性”我指的是只测试一次模型,以计算所有这些指标

我有两个问题:

  • 首先,我想知道我是否正确计算了所有这些指标(不管是否有一个短的),如果没有,请在这里指出我的错误

  • 如果这些指标计算正确,那么如何在短时间内计算它们

  • 如何解释混淆矩阵输出

    示例:这是使用CNN模型的分类问题。它们试图对符号信号(0、1、2、3、4、5)进行分类。班级总数为6人

  • 代码:


    对于多类分类,您可以遵循以下步骤

    import tensorflow as tf
    from tensorflow.keras import datasets, layers, models
    import matplotlib.pyplot as plt
    import numpy as np
    from tensorflow.keras.callbacks import Callback 
    from sklearn.metrics import classification_report
    
    (train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
    
    train_images = train_images.reshape((60000, 28, 28, 1))
    test_images = test_images.reshape((10000, 28, 28, 1))
    
    train_images, test_images = train_images / 255.0, test_images / 255.0
    
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    
    model.add(layers.Flatten())
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(10, activation='softmax'))
    
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    
    class MetricsCallback(Callback):
        def __init__(self, test_data, y_true):
            self.y_true = y_true
            self.test_data = test_data
    
        def on_epoch_end(self, epoch, logs=None):
             y_pred = self.model.predict(self.test_data)
             y_pred = tf.argmax(y_pred,axis=1)
             report_dictionary = classification_report(self.y_true, y_pred, output_dict = True)
             print(classification_report(self.y_true,y_pred,output_dict=False)) 
    
    metrics_callback = MetricsCallback(test_data=test_images, y_true=test_labels)
    
    model.fit(train_images, 
                train_labels, 
                epochs=1, 
                validation_data=(test_images, test_labels), callbacks=[metrics_callback])
    
    输出:

    59904/60000 [============================>.] - ETA: 0s - loss: 0.0049 - accuracy: 0.9984    
    
                    precision    recall  f1-score   support    
               0       1.00      1.00      1.00       980
               1       0.99      1.00      1.00      1135
               2       0.99      0.99      0.99      1032
               3       0.99      1.00      0.99      1010
               4       0.98      0.99      0.99       982
               5       0.99      0.99      0.99       892
               6       1.00      0.98      0.99       958
               7       0.99      0.99      0.99      1028
               8       0.99      0.99      0.99       974
               9       0.99      0.98      0.99      1009
    
        accuracy                           0.99     10000
       macro avg       0.99      0.99      0.99     10000
    weighted avg       0.99      0.99      0.99     10000
    
    对于二进制分类,您可以使用内置累加器,如下所示

    model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy',tf.keras.metrics.Precision(),tf.keras.metrics.Recall()])
    
    model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy',tf.keras.metrics.Precision(),tf.keras.metrics.Recall()])