实战演练:使用文心进行模型效果评估
更新时间:2022-08-01
在上一节实战演练:使用文心进行模型训练中,我们提到过可以通过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。