资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

实战演练:使用文心进行模型效果评估

在上一节实战演练:使用文心进行模型训练中,我们提到过可以通过json设置,在dataset_reader中设置test_reader、dev_reader,在trainer中设置is_eval_dev、is_eval_test ,在模型训练过程中完成对当前某一时刻的模型效果评估。除此之外,在训练结束之后,我们也可以通过训练过程产生的checkpoints文件进行模型效果的评估。

环境安装

环境安装与配置

准备工作

  • 准备待预测的模型文件:在上一节中我们介绍到训练结束后模型会保存在./output/cls_bow_ch/下,其中save_inference_model/目录的下的模型文件可以用来做预测推理,save_checkpoints/目录下的模型文件可以用来做热启动和模型评估,所以在该目录下找到被保存的checkpoints文件,如checkpoint_step_251就可以来评估这个在第251个step时保存的BOW二分类模型的效果。
  • 准备好待评估的数据:数据格式与训练过程中的评估集、验证集一致,可以参考上一节内容,这里不再赘述。

配置参数

  • 与上一节中的训练json配置基本一致,需要修改的地方为:

    • ①在dataset_reader中一定要配置dev_reader;
    • ②在trainer部分,一定要将is_eval_dev设为1,load_checkpoint设置为待评估模型的checkpoints文件目录地址。
  • 这里以BOW文本分类模型预置的训练json文件cls_bow_ch.json为例,修改部分用注释标注,如下所示:
{
  "dataset_reader": {
    "train_reader": {    ## 与训练过程中的train_reader一致,不再赘述。
      "name": "train_reader",
      "type": "BasicDataSetReader",
      "fields": [
        {
          "name": "text_a",
          "data_type": "string",
          "reader": {
            "type": "CustomTextFieldReader"
          },
          "tokenizer": {
            "type": "CustomTokenizer",
            "split_char": " ",
            "unk_token": "[UNK]",
            "params": null
          },
          "need_convert": true,
          "vocab_path": "./dict/vocab.txt",
          "max_seq_len": 512,
          "truncation_type": 0,
          "padding_id": 0
        },
        {
          "name": "label",
          "data_type": "int",
          "reader": {
            "type": "ScalarFieldReader"
          },
          "tokenizer": null,
          "need_convert": false,
          "vocab_path": "",
          "max_seq_len": 1,
          "truncation_type": 0,
          "padding_id": 0,
          "embedding": null
        }
      ],
      "config": {
        "data_path": "./data/train_data",
        "shuffle": false,
        "batch_size": 8,
        "epoch": 10,
        "sampling_rate": 1.0,
        "need_data_distribute": true,
        "need_generate_examples": false,
        "key_tag": false
      }
    },
    "dev_reader": {    ## 与训练过程中的dev_reader配置一致,不再赘述
      "name": "dev_reader",
      "type": "BasicDataSetReader",
      "fields": [
        {
          "name": "text_a",
          "data_type": "string",
          "reader": {
            "type": "CustomTextFieldReader"
          },
          "tokenizer": {
            "type": "CustomTokenizer",
            "split_char": " ",
            "unk_token": "[UNK]",
            "params": null
          },
          "need_convert": true,
          "vocab_path": "./dict/vocab.txt",
          "max_seq_len": 512,
          "truncation_type": 0,
          "padding_id": 0,
          "embedding": {
            "type": "CustomFluidTokenEmbedding",
            "use_reader_emb": false,
            "emb_dim": 128
          }
        },
        {
          "name": "label",
          "data_type": "int",
          "reader": {
            "type": "ScalarFieldReader"
          },
          "tokenizer": null,
          "need_convert": false,
          "vocab_path": "",
          "max_seq_len": 1,
          "truncation_type": 0,
          "padding_id": 0,
          "embedding": null
        }
      ],
      "config": {
        "data_path": "./data/dev_data",
        "shuffle": false,
        "batch_size": 8,
        "epoch": 1,
        "sampling_rate": 1.0,
        "need_data_distribute": false,
        "need_generate_examples": false,
        "key_tag": false
      }
    }
  },
  "model": {
    "type": "BowClassification",
    "is_dygraph": 1,
    "optimization": {
      "learning_rate": 2e-5
    },
    "vocab_size": 33261,
    "num_labels": 2
  },
  "trainer": {
    "type": "CustomDynamicTrainer",
    "PADDLE_PLACE_TYPE": "cpu",
    "PADDLE_IS_FLEET": 0,
    "train_log_step": 20,
    "is_eval_dev": 1,   ## 与dev_reader呼应,必须设置为1
    "is_eval_test": 0,
    "num_train_examples": 200,
    "eval_step": 100,
    "save_model_step": 10000,
    "load_parameters": "",
    "load_checkpoint": "./output/cls_bow_ch/save_checkpoints/checkpoints_step_251", ## 必填参数,为待评估模型的checkpoints目录地址。
    "pre_train_model": [],
    "output_path": "./output/cls_bow_ch",
    "extra_param": {
      "meta":{
        "job_type": "text_classification"
      }
    }
  }
}

修改启动脚本

  • 因为这个篇幅里,我们仅对已有模型进行效果评估,不再进行训练,所以需要手动修改一下原来的训练
#脚本(run_trainer.py)中的run_trainer方法,修改示例如下:

def run_trainer(param_dict):
  """
  :param param_dict:
  :return
  """
  logging.info("run trainer.... pid = " + str(os.getpid()))
  dataset_reader_params_dict = param_dict.get("dataset_reader")
  dataset_reader = dataset_reader_from_params(dataset_reader_params_dict)
  model_params_dict = param_dict.get("model")
  model, num_train_examples = model_from_params(model_params_dict, dataset_reader)
  model_params_dict["num_train_examples"] = num_train_examples
  trainer_params_dict = param_dict.get("trainer")
  trainer = build_trainer(trainer_params_dict, dataset_reader, model, num_train_examples)
  # step1:将模型训练时调用的train_and_eval()方法注释掉
  # trainer.train_and_eval()
  # step2:import InstanceName中关于操作状态的静态变量
  from wenxin.common.rule import InstanceName
  # step3:调用trainer.evaluate(dataset_reader.dev_reader, InstanceName.EVALUATE, 0)进行评估,其中dataset_reader.dev_reader就是我们刚刚在json中设置的dev_reader,后两个参数为默认值,不需要修改。
  trainer.do_evaluate(dataset_reader.dev_reader, InstanceName.EVALUATE, 0)
  logging.info("end of run train and eval .....")

启动

  • 运行脚本:修改完json文件和运行脚本后,我们可以继续运行下面的命令,通过热启动的方式,对已经训练好的模型在测试集上进行评估。
# BOW 中文文本分类模型
# 基于json实现预置网络的模型效果评估。其调用了配置文件./examples/cls_bow_ch.json
python run_trainer.py --param_path ./examples/cls_bow_ch.json
  • 评估结果:通过查看.log/test.log文件,我们可以看到之前训练得到的模型在测试集上的评估结果,部分日志如下所示:
 ....
INFO: 03-09 19:14:50: run_trainer.py:94 * 4635143616 run trainer.... pid = 40267
INFO: 03-09 19:14:50: controler.py:68 * 4635143616 framework version is major-1.3.0
BowClassification
INFO: 03-09 19:14:50: controler.py:156 * 4635143616 finish prepare cpu multi
INFO: 03-09 19:14:50: controler.py:834 * 4635143616 Load model from ./output/cls_bow_ch/save_checkpoints/checkpoints_step_251
fleet =  False
INFO: 03-09 19:14:50: base_dataset_dataloader.py:115 * 4635143616 set data_loader's generator and start.......
....
DEBUG: 03-09 19:14:50: bow_classification.py:158 * 4635143616 phase = evaluate acc = 0.606 precision = 0.651 time_cost = 0.057109832763671875  ## 这里为当前模型的评估结果
INFO: 03-09 19:14:50: run_trainer.py:107 * 4635143616 end of run train and eval .....

由上面的日志,我们可以看出,当前的这个模型在所设置的验证集上,acc为0.606, precision为0.651。

上一篇
实战演练:使用动态图训练
下一篇
实战演练:使用文心进行模型推理