Keras如何输出每类准确率?

新手上路,请多包涵

Caffe不仅可以打印整体准确率,还可以打印每类准确率。

在 Keras 日志中,只有整体准确性。我很难计算单独的班级准确度。

 Epoch 168/200

0s - loss: 0.0495 - acc: 0.9818 - val_loss: 0.0519 - val_acc: 0.9796

Epoch 169/200

0s - loss: 0.0519 - acc: 0.9796 - val_loss: 0.0496 - val_acc: 0.9815

Epoch 170/200

0s - loss: 0.0496 - acc: 0.9815 - val_loss: 0.0514 - val_acc: 0.9801

有人知道如何在 keras 中输出每类精度吗?

原文由 spider 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 695
2 个回答

精确率和召回率是多类分类更有用的衡量标准(见 定义)。按照 Keras MNIST CNN 示例(10 类分类),您可以使用 classification_reportsklearn.metrics 获取每类度量:

 from sklearn.metrics import classification_report
import numpy as np

Y_test = np.argmax(y_test, axis=1) # Convert one-hot to index
y_pred = model.predict_classes(x_test)
print(classification_report(Y_test, y_pred))

这是结果:

          precision    recall  f1-score   support

      0       0.99      1.00      1.00       980
      1       0.99      0.99      0.99      1135
      2       1.00      0.99      0.99      1032
      3       0.99      0.99      0.99      1010
      4       0.98      1.00      0.99       982
      5       0.99      0.99      0.99       892
      6       1.00      0.99      0.99       958
      7       0.97      1.00      0.99      1028
      8       0.99      0.99      0.99       974
      9       0.99      0.98      0.99      1009

avg / total   0.99      0.99      0.99     10000

原文由 desertnaut 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可能希望使用回调,您可以轻松地将其添加到 model.fit() 调用中。

例如,您可以使用 keras.callbacks.Callback 接口定义自己的类。我建议使用 on_epoch_end() 函数,因为如果您决定使用该冗长设置进行打印,它将在您的训练摘要中很好地格式化。请注意,此特定代码块设置为使用 3 个类,但您当然可以将其更改为您想要的数量。

 # your class labels
classes = ["class_1","class_2", "class_3"]

class AccuracyCallback(tf.keras.callbacks.Callback):

    def __init__(self, test_data):
        self.test_data = test_data

    def on_epoch_end(self, epoch, logs=None):
        x_data, y_data = self.test_data

        correct = 0
        incorrect = 0

        x_result = self.model.predict(x_data, verbose=0)

        x_numpy = []

        for i in classes:
            self.class_history.append([])

        class_correct = [0] * len(classes)
        class_incorrect = [0] * len(classes)

        for i in range(len(x_data)):
            x = x_data[i]
            y = y_data[i]

            res = x_result[i]

            actual_label = np.argmax(y)
            pred_label = np.argmax(res)

            if(pred_label == actual_label):
                x_numpy.append(["cor:", str(y), str(res), str(pred_label)])
                class_correct[actual_label] += 1
                correct += 1
            else:
                x_numpy.append(["inc:", str(y), str(res), str(pred_label)])
                class_incorrect[actual_label] += 1
                incorrect += 1

        print("\tCorrect: %d" %(correct))
        print("\tIncorrect: %d" %(incorrect))

        for i in range(len(classes)):
            tot = float(class_correct[i] + class_incorrect[i])
            class_acc = -1
            if (tot > 0):
                class_acc = float(class_correct[i]) / tot

            print("\t%s: %.3f" %(classes[i],class_acc))

        acc = float(correct) / float(correct + incorrect)

        print("\tCurrent Network Accuracy: %.3f" %(acc))

然后,您将要配置您的新回调以适合您的模型。假设您的验证数据 ( val_data ) 是一些元组对,您可以使用以下内容:

 accuracy_callback = AccuracyCallback(val_data)

# you can use the history if desired
history = model.fit( x=_, y=_, verbose=1,
           epochs=_, shuffle=_, validation_data = val_data,
           callbacks=[accuracy_callback], batch_size=_
         )

请注意,_ 表示可能会根据您的配置更改的值

原文由 Ryan Toner 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题