6.实战演练:使用文心进行模型评估
更新时间:2021-03-30
在上一节实战演练:使用文心进行模型训练中,我们提到过可以通过json设置,在dataset_reader中设置test_reader、dev_reader,在trainer中设置is_eval_dev、is_eval_test ,在模型训练过程中完成对当前某一时刻的模型效果评估。除此之外,在训练结束之后,我们也可以通过训练过程产生的checkpoints文件进行模型效果的评估。
环境安装
准备工作
- 准备待预测的模型文件:在上一节中我们介绍到训练结束后模型会保存在./output/cls_cnn_ch/下,其中save_inference_model/目录的下的模型文件可以用来做预测推理,save_checkpoints/目录下的模型文件可以用来做热启动和模型评估,所以在该目录下找到被保存的checkpoints文件,如checkpoint_step_251就可以来评估这个在第251个step时保存的CNN二分类模型的效果。
- 准备好待评估的数据:数据格式与训练过程中的评估集、验证集一致,可以参考上一节内容,这里不再赘述。
配置参数
- 与上一节中的训练json配置基本一致,需要修改的地方为:①在dataset_reader中一定要配置dev_reader。②在trainer部分,一定要将is_eval_dev设为1,load_checkpoint设置为待评估模型的checkpoints文件目录地址。这里以CNN文本分类模型预置的训练json文件cls_cnn_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
}
},
"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
}
}
},
"model": {
"type": "CnnClassification",
"optimization": {
"learning_rate": 2e-5
},
"vocab_size": 33261,
"num_labels": 2
},
"trainer": {
"PADDLE_USE_GPU": 0,
"PADDLE_IS_LOCAL": 1,
"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_cnn_ch/save_checkpoints/checkpoints_step_251", ## 必填参数,为待评估模型的checkpoints目录地址。
"use_fp16": 0,
"pre_train_model": [],
"output_path": "./output/cls_cnn_ch",
"extra_param": {
"meta":{
"job_type": "text_classification"
}
}
}
}修改启动脚本
-
因为这个篇幅里,我们仅对已有模型进行效果评估,不再进行训练,所以需要手动修改一下原来的训练脚本(run_with_json.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.evaluate(dataset_reader.dev_reader, InstanceName.EVALUATE, 0) logging.info("end of run train and eval .....")
启动
-
运行脚本:修改完json文件和运行脚本后,我们可以继续运行下面的命令,通过热启动的方式,对已经训练好的模型在测试集上进行评估。
# CNN 中文文本分类模型 # 基于json实现预置网络的模型效果评估。其调用了配置文件./examples/cls_cnn_ch.json python run_with_json.py --param_path ./examples/cls_cnn_ch.json -
评估结果:通过查看.log/test.log文件,我们可以看到之前训练得到的模型在测试集上的评估结果,部分日志如下所示:
.... INFO: 03-09 19:14:50: run_with_json.py:94 * 4635143616 run trainer.... pid = 40267 INFO: 03-09 19:14:50: controler.py:68 * 4635143616 framework version is major-1.3.0 CnnClassification 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_cnn_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: cnn_classification.py:158 * 4635143616 phase = evaluate acc = 0.606 precision = 0.651 time_cost = 0.057109832763671875 ## 这里为当前模型的评估结果 INFO: 03-09 19:14:50: run_with_json.py:107 * 4635143616 end of run train and eval .....由上面的日志,我们可以看出,当前的这个模型在所设置的验证集上,acc为0.606, precision为0.651。
