本文介绍如何对模型准确率、召回率等指标进行评测,并查看和对比模型评测结果。

前提条件

新建评测任务

  1. 访问AI开发控制台
  2. 在AI开发控制台的左侧导航栏中,单击模型管理
  3. 模型列表中目标模型的右侧操作列单击新建评测
  4. 评测任务信息评测任务配置中配置相关参数。
    区域 参数 说明
    评测任务信息 评测任务名称 评测任务的名称。
    说明 名称要求不超过256个字符,可包含数字、汉字、英文字符或连字符(-),不区分大小写。
    评测任务镜像 评测任务所运行的基础镜像。
    命名空间 评测任务所运行的命名空间。
    镜像拉取凭证 可选,私有镜像拉取凭证。
    数据源配置 可选,数据源配置。

    如果需要引入数据PVC,则需要配置数据源。

    加载模型路径 评测任务中评测的模型所在的路径。
    加载数据集路径 评测任务中参与评测的数据集所在的路径。
    输出指标路径 评测任务中评测结果指标输出的路径。
    执行命令 评测任务容器执行的命令。
    代码配置 代码Git源配置。

    如果需要从Git源拉取评测代码,则需要配置代码Git源。

    评测任务配置 GPU(核数) 评测任务所需要申请占用的资源。
    内存(GB)
    GPU(卡数)
    以上参数与Arena中评测任务中提交的参数相对应。您可以使用默认的评测任务代码,也可以自定义编写。关于如何编写评测任务代码,请参见编写评测任务代码
  5. 单击提交评测任务
    您可在评测任务页面查看该评测任务的相关信息。

查看评测指标

  1. 在AI开发控制台的左侧导航栏中,单击评测任务
    查看评测任务
  2. 任务列表中单击对应评测任务的名称,即可看到对应评测任务的指标。
    查看评测指标

    示例中展示了关于模型的Accuracy(正确率)、Precision(准确率)、Recall(召回率)、F1_score(准确率和召回率的平均值)、ROC曲线(受试者工作特征曲线,即Receiver Operating Characteristic Curve)及AOC(ROC曲线下面积,即Area Under roc Curve)的基础评测指标。

对比评测指标

  1. 在AI开发控制台的左侧导航栏中,单击评测任务
  2. 任务列表中,选中多个目标评测任务的左侧复选框(至少选择两个评测任务),单击右上角的指标对比
    对比评测指标
    在评测指标对比页面,开发控制台会将被选定的评测任务的指标绘制为柱状图,可以根据直观展示的指标或者对每个任务指标的定量分析选择部署适当的模型。评测指标对比

编写评测任务代码

根据以下操作自定义编写评测任务代码。关于评测任务编写示例,请参见评测任务编写示例

  1. 执行以下命令导入ABC包与KubeAI包。
    from abc
    import ABC from kubeai.evaluate.evaluator
    import Evaluator from kubeai.api
    import KubeAI
  2. 编写自定义Evaluator类继承抽象类Evaluator,并重写preprocess_datasetload_modelevaluate_modelreport_metrics方法,分别承担数据集预处理、模型加载、模型评测、评测报告导出的任务。
    class CustomerEvaluatorDemo(Evaluator, ABC):
        def preprocess_dataset(self): # 数据集预处理。
        def load_model(self): # 模型加载。
        def evaluate_model(self, dataset): # 模型评测。
        def report_metrics(self, metrics): # 评测报告导出。
  3. 新建API客户端并传入新建的Evaluator对象,调用Evaluate方法执行评测任务。
    customer_evaluator = CustomerEvaluatorDemo()
    KubeAI.evaluate(customer_evaluator)
    如果需要在开发本地测试,可以通过传入dataset_dirmodel_dirreport_dir调用Test来执行本地的测试。
    customer_evaluator = CustomerEvaluatorDemo()
    KubeAI.test(customer_evaluator, model_dir, dataset_dir, report_dir)

评测任务编写示例

本示例基于Tensorflow1.15的MNIST分类模型进行评测。
from kubeai.evaluate.evaluator import Evaluator
from abc import ABC
from kubeai.api import KubeAI
import tensorflow as tf
import numpy as np
from tensorflow.keras import layers, models

class CNN(object):
    def __init__(self):
        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.summary()
        self.model = model

class TensorflowEvaluatorDemo(Evaluator, ABC):

    def preprocess_dataset(self):   #数据集预处理。
        with np.load(self.dataset_dir) as f:
            x_train, y_train = f['x_train'], f['y_train']
            x_test, y_test = f['x_test'], f['y_test']

        train_images = x_train.reshape((60000, 28, 28, 1))
        test_images = x_test.reshape((10000, 28, 28, 1))
        train_images, test_images = train_images / 255.0, test_images / 255.0

        train_images, train_labels = train_images, y_train
        test_images, test_labels = test_images, y_test
        test_loader = {
            "test_images" : test_images,
            "test_labels" : test_labels
        }
        return test_loader

    def load_model(self):  #模型加载。
        latest = tf.train.latest_checkpoint(self.model_dir)
        self.cnn = CNN()
        self.model = self.cnn.model
        self.model.load_weights(latest)

    def evaluate_model(self, dataset):  #模型评测。 
        metrics = Utils.evaluate_function_classification_tensorflow1(model=self.model, evaluate_x=dataset["test_images"], evaluate_y=dataset["test_labels"])
        predictions = self.model.predict(dataset["test_images"])
        pred = []
        for arr in predictions:
            pred.append(np.argmax(arr))
        pred = np.array(pred)
        confusion_matrix = mt.confusion_matrix(dataset["test_labels"], pred)
        metrics["Confusion_matrix"] = str(confusion_matrix)
        return metrics

    def report_metrics(self, metrics):  #评测报告导出。
        print(metrics)
        Utils.ROC_plot(fpr=metrics["ROC"]["fpr"], tpr=metrics["ROC"]["tpr"], report_dir=self.report_dir)
        print("Here is the customer-defined report method")

if __name__ == '__main__':
    tensorflow_evaluator = TensorflowEvaluatorDemo()  #新建API客户端并传入新建的Evaluator对象,调用Evaluate方法执行评测任务。
    KubeAI.evaluate(tensorflow_evaluator)
    # KubeAI.test(tensorflow_evaluator, model_dir, dataset_dir, report_dir)  #开发本地测试。