.
├── data ### 示例数据文件夹,包括各任务所需的训练集、测试集、验证集和预测集
│ ├── dev_data
│ │ └── dev.txt
│ ├── predict_data
│ │ └── infer.txt
│ ├── test_data
│ │ └── test.txt
│ └── train_data
│ └── train.txt
│ ├── download_data.sh
├── examples ### 各典型网络的json配置文件,infer后缀的为对应的预测配置文件
│ ├── seqlab_ernie_fc_ch.json
│
│ ├── seqlab_ernie_fc_ch_infer.json
├── inference ### 模型预测代码
│ └── custom_inference.py ### 序列标注任务通用的模型预测代码
├── model ### 序列标注任务相关的网络文件
│ ├── ernie_fc_sequence_label.py
├── run_infer.py ### 依靠json进行模型预测的入口脚本
├── run_trainer.py ### 依靠json进行模型训练的入口脚本
└── trainer ### 模型训练和评估代码
├── custom_dynamic_trainer.py ### 动态库模式下的模型训练评估代码
└── custom_trainer.py ### 静态图模式下的模型训练评估代码
└── dict ### 模型训练和评估代码
├── vocab_label_map.txt ### 序列标注的标签配置
└── vocab.txt ### 词典
海 钓 比 赛 地 点 在 厦 门 与 金 门 之 间 的 海 域 。 O O O O O O O B-LOC I-LOC O B-LOC I-LOC O O O O O O
周 恩 来 总 理 说 , 那 就 送 一 株 万 古 常 青 的 友 谊 红 杉 吧 ! B-PER I-PER I-PER O O O O O O O O O O O O O O O O O O O O
沙 特 队 教 练 佩 雷 拉 : 两 支 队 都 想 胜 , 因 此 都 作 出 了 最 大 的 努 力 。 B-ORG I-ORG I-ORG O O B-PER I-PER I-PER O O O O O O O O O O O O O O O O O O O O
[PAD] 0
[CLS] 1
[SEP] 2
[MASK] 3
, 4
的 5
、 6
一 7
人 8
有 9
是 10
B-PER 0
I-PER 1
B-ORG 2
I-ORG 3
B-LOC 4
I-LOC 5
O 6
cd ./applications/tasks/sequence_labeling
{
"dataset_reader": {
"train_reader": { ### 训练、验证、测试各自基于不同的数据集,数据格式也可能不一样,可以在json中配置不同的reader,此处为训练集的reader。
"name": "train_reader",
"type": "BasicDataSetReader", ### 采用BasicDataSetReader,其封装了常见的读取tsv文件、组batch等操作。
"fields": [ ### 域(field)是文心的高阶封装,对于同一个样本存在不同域的时候,不同域有单独的数据类型(文本、数值、整型、浮点型)、单独的词表(vocabulary)等,可以根据不同域进行语义表示,如文本转id等操作,field_reader是实现这些操作的类。
{
"name": "text_a", ### 序列标注的文本特征域,命名为"text_a"。
"data_type": "string", ### data_type定义域的数据类型,文本域的类型为string,整型数值为int,浮点型数值为float。
"reader": {"type":"CustomTextFieldReader"}, ### 采用针对文本域的通用reader "CustomTextFieldReader"。数值数组类型域为"ScalarArrayFieldReader",数值标量类型域为"ScalarFieldReader"。
"tokenizer":{
"type":"CustomTokenizer", ### 指定该文本域的tokenizer为CustomTokenizer。
"split_char":" ", ### 通过空格区分不同的token。
"unk_token":"[UNK]", ### unk标记为"[UNK]"。
"params":null
},
"need_convert": true, ### "need_convert"为true说明数据格式是明文字符串,需要通过词表转换为id。
"vocab_path": "../../models_hub/ernie_3.0_base_ch_dir/vocab.txt", ### 指定该文本域的词表。
"max_seq_len": 512, ### 设定每个域的最大长度。
"truncation_type": 0, ### 选择截断策略,0为从头开始到最大长度截断,1为从头开始到max_len-1的位置截断,末尾补上最后一个id(词或字),2为保留头和尾两个位置,然后按从头开始到最大长度方式截断。
"padding_id": 0 ### 设定padding时对应的id值。
}, ### 如果每一个样本有多个特征域(文本类型、数值类型均可),可以仿照前面对每个域进行设置,依次增加每个域的配置即可。此时样本的域之间是以\t分隔的。
{
"name": "label", ### 标签也是一个单独的域,命名为"label"。如果多个不同任务体系的标签存在于多个域中,则可实现最基本的多任务学习。
"data_type": "string", ### 序列标注任务中,标签是文本类型。
"reader":{"type":"CustomTextFieldReader"},
"tokenizer":{
"type":"CustomTokenizer",
"split_char":" ",
"unk_token":"O",
"params":null
},
"need_convert": true,
"vocab_path": "./dict/vocab_label_map.txt", ### 配置标签的标注方式
"max_seq_len": 512,
"truncation_type": 0,
"padding_id": 0
}
],
"config": {
"data_path": "./data/train_data/", ### 训练数据train_reader的数据路径,写到文件夹目录。
"shuffle": false,
"batch_size": 8,
"epoch": 10,
"sampling_rate": 1.0
"need_data_distribute": true, ### 表示数据读取过程中是否需要按卡数进行分发,true表示每张卡在同一个step中读取到的数据是不一样的,false表示每张卡在同一个step中读取到的数据是一样的,训练集默认为true,测试集、验证集、预测集都是false。
"need_generate_examples": false ### 表示在数据读取过程中除了id化好的tensor数据外,是否需要返回原始明文样本。
}
},
……
},
"model": {
"type": "ErnieFcSeqLabel", ### 使用的模型网络类。
"is_dygraph": 0,
"optimization": { ### 优化器设置,建议使用文心ERNIE推荐的默认设置。
"learning_rate": 5e-05,
"use_lr_decay": true,
"warmup_steps": 0,
"warmup_proportion": 0.1,
"weight_decay": 0.01,
"use_dynamic_loss_scaling": false,
"init_loss_scaling": 128,
"incr_every_n_steps": 100,
"decr_every_n_nan_or_inf": 2,
"incr_ratio": 2.0,
"decr_ratio": 0.8
},
"embedding": { ### ERNIE中的embedding参数设置,必填参数。
"config_path": "../../models_hub/ernie_3.0_base_ch_dir/ernie_config.json" ### 当前ERNIE模型的配置文件,请填入所采用的ERNIE预训练模型对应的模型配置文件。
}
},
"trainer": {
"type": "CustomTrainer", ### 表示使用的trainer对应的类名,注意要区分静态图(CustomTrainer)和动态图(CustomDynamicTrainer)。
"PADDLE_PLACE_TYPE": "gpu", ### 表示运行时的设备类别,取值为cpu和gpu。
"PADDLE_IS_FLEET": 0, ### 表示是否使用fleetrun模式进行训练,gpu多卡情况下必须设置为1,并使用fleetrun命令进行训练。
"train_log_step": 10, ### 训练时打印训练日志的间隔步数。
"use_amp": true, ### 是否开启混合精度模式的训练。
"is_eval_dev": 0, ### 是否在训练的时候评估验证集,1为需评估,此时必须配置dev_reader。
"is_eval_test": 1, ### 是否在训练的时候评估测试集,1为需评估,此时必须配置test_reader。
"eval_step": 100, ### 进行测试集或验证集评估的间隔步数。
"save_model_step": 200, ### 保存模型时的间隔步数,建议设置为eval_step的整数倍。
"load_parameters": "", ### 加载已训练好的模型的op参数值,不会加载训练步数、学习率等训练参数,可用于加载预训练模型。如需使用填写具体文件夹路径即可。
"load_checkpoint": "", ### 加载已训练好的模型的所有参数,包括学习率等,可用于热启动。如需使用填写具体文件夹路径即可。
"pre_train_model": [ ### 加载预训练模型,ERNIE任务的必填参数,非ERNIE任务置为[]即可。
{
"name": "ernie_3.0_base_ch_dir", ### 预训练模型的名称。
"params_path": "../../models_hub/ernie_3.0_base_ch_dir/params" ### 预训练模型的参数目录。
}
],
"output_path": "./output/seqlab_ernie_3.0_base_fc_ch", ### 保存模型的输出路径,若为空则默认。为"./output"
"extra_param": {"meta":{"job_type": "sequence_labeling"} ### 额外的参数信息。
}
}
python run_trainer.py --param_path ./examples/seqlab_ernie_fc_ch.json
{
"dataset_reader": {
"predict_reader": {
"name": "predict_reader",
"type": "BasicDataSetReader",
"fields": [
{
"name": "text_a",
"data_type": "string",
"reader": {
"type": "ErnieTextFieldReader"
},
"tokenizer": {
"type": "FullTokenizer",
"split_char": " ",
"unk_token": "[UNK]",
"params": null
},
"need_convert": true,
"vocab_path": "../../models_hub/ernie_3.0_base_ch_dir/vocab.txt",
"max_seq_len": 512,
"truncation_type": 0,
"padding_id": 0,
"embedding": null
}
],
"config": {
"data_path": "./data/predict_data",
"shuffle": false,
"batch_size": 16,
"epoch": 1,
"sampling_rate": 1.0,
"need_data_distribute": false,
"need_generate_examples": true
}
}
},
"inference": {
"PADDLE_PLACE_TYPE": "gpu",
"PADDLE_IS_LOCAL": 1,
"is_ernie": true,
"inference_model_path": "./output/seqlab_ernie_3.0_base_fc_ch/save_inference_model/inference_step_601", #加载推理模型的路径
"extra_param": {
"meta":{
"job_type": "sequence_labeling"
}
}
}
}