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

开始训练与预测

环境安装

环境安装与配置

目录结构

文本分类任务位于/wenxin/tasks/sequence_labeling

├── __init__.py                                                               
├── env.sh                                                 ## 非镜像开发套件环境变量配置脚本
├── run_with_json.py                                       ## 只依靠json进行模型训练的入口脚本
├── run_infer.py                                           ## 只依靠json进行模型预测的入口脚本
├── examples                                               ## 各典型网络的json配置文件
│   ├── seqlab_crf_ch.json
│   ├── seqlab_crf_ch_infer.json
│   ├── seqlab_ernie_2.0_base_crf_ch.json
│   └── ...
├── data`                                                   `## 示例数据文件夹,包括各任务所需训练集(train_data)、测试集(test_data)、验证集(dev_data)和预测集(predict_data)
│   ├── train_data
│   │   └── train.txt
│   ├── test_data
│   │   └── test.txt
│   ├── dev_data
│   │   └── dev.txt
│   └── predict_data
│        └── infer.txt
├── dict`                                                   `## 示例词表文件夹
     ``├── vocab_label_map.txt`                               `## 示例IOB标注方式的标签词表
     ``└── vocab.txt
└── ...

预置Reader配置

通过json文件中的dataset_reader部分对预置reader进行配置,以序列标注任务seqlab_crf_ch.json为例,其dataset_reader部分如下所示:

{
  "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": "./dict/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
      }
    },
    ……
  },
  ……
}

自定义Reader配置

自定义reader配置根据具体项目情况通过对base_dataset_reader基类重写来实现。变量设置规则在common.rule.InstanceName中,该部分囊括了model和data部分的全局变量,实现了数据部分与组网部分的衔接,前向传播loss与优化器反向传播loss、计算metric的loss的衔接。部分与数据相关示例如下所示:

...
    RECORD_ID = "id"
    RECORD_EMB = "emb"
    SRC_IDS = "src_ids"
    MASK_IDS = "mask_ids"
    SEQ_LENS = "seq_lens"
    SENTENCE_IDS = "sent_ids"
    POS_IDS = "pos_ids"
    TASK_IDS = "task_ids"
...

Tokenizer配置

针对使用ernie预训练模型进行finetuning的任务,针对文本域默认配置了FullTokenizer对文本进行处理,一般FullTokenizer会先去除文本域的空格,并对中文进行切字处理,对英文进行subword;如果样本中含有英文,subword后会出现文本域和标签域shape对不上的问题;可以通过修改FullTokenizer为CustomTokenizer进行解决;即不对文本域做任何处理,并以split_char做切分得到最终的tokens;

也可以利用如下脚本快速校验分词后的token是否与label长度匹配:

if __name__ == "__main__":
    # text = "丰 田 rav 4 荣 放 2 0 2 0 款 两 驱 多 少 钱\tO O O O O O O O O O O O O O O O O O"
    vocab_file = "./model_files/dict/vocab_ernie_2.0_base_ch.txt"
 
    tokenizer = FullTokenizer(vocab_file=vocab_file)
    with open("train.txt", 'r') as f:
        lines = f.readlines()
        for index, line in enumerate(lines):
            line = line.rstrip()
            fileds = line.split('\t')
            tokens = tokenizer.tokenize(fileds[0])
            labels = fileds[1].split(' ')
            if len(labels) != len(tokens):
                print("index: ", index, "\t", line, "\t len(labels): ", len(labels), "  len(tokens): ", len(tokens))
                # break

开始训练

  • 如您使用镜像开发套件,您可直接进入下一步骤。如您将文心开发套件与本地已有的开发环境相结合,您需要在./env.sh中配置对应的环境变量,并执行source env.sh ,如需了解更多详情,请参考3.环境安装与配置
  • 模型训练的入口脚本为./run_with_json.py , 通过—param_path参数来传入./examples/目录下的json配置文件。例如:python run_with_json.py --param_path ./examples/seqlab_ernie_2.0_base_crf_ch.json
  • 训练运行的日志会自动保存在./log/test.log文件中.
  • 训练中以及结束后产生的模型文件会默认保存在./output/seqlab_ernie_2.0_base_crf_ch/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件。

开始预测

  • 如您使用镜像开发套件,您可直接进入下一步骤。如您将文心开发套件与本地已有的开发环境相结合,您需要在./env.sh中配置对应的环境变量,并执行source env.sh ,如需了解更多详情,请参考环境安装与配置
  • 选定配置好的json文件,把你将要预测的模型对应的inference_model文件路径填入json文件的“inference_model_path”变量中。
  • 模型训练的入口脚本为./run_infer.py , 通过—param_path参数来传入./examples/目录下的json配置文件。例如:python run_infer.py --param_path ./examples/seqlab_ernie_2.0_base_crf_ch_infer.json
  • 预测运行的日志会自动保存在./output/predict_result.txt文件中。
上一篇
准备工作
下一篇
阅读理解任务