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

开始训练与预测

开始训练&预测(分类任务)

环境安装

环境安装与配置

目录结构

文本分类任务位于/wenxin_appzoo/tasks/text_classification

── data                                      ## 各种demo数据集
│   ├── dev_data
│   │   └── dev_1.txt
│   ├── dict
│   │   └── vocab.txt
│   ├── download_data.sh
│   ├── multi_label_data      ## 多标签分类demo数据集
│   │   ├── dev_data
│   │   │   └── dev.txt
│   │   ├── test_data
│   │   │   └── test.txt
│   │   └── train_data
│   │       └── train.txt
│   ├── predict_data
│   │   └── infer.txt
│   ├── test_data
│   │   └── test.txt
│   ├── train_data
│   │   └── train.txt
│   └── xnli             ## xnli数据集,ERNIE3.0的demo数据
│       ├── dev
│       │   └── dev.tsv
│       ├── test
│       │   └── test.tsv
│       └── train
│           └── train.tsv
├── data_set_reader    ## 数据读取器
│   ├── ernie_classification_base_dataset_reader.py
│   └── ernie_classification_dataset_reader.py
├── examples          ## 内置的常用任务配置
│   ├── cls_bow_ch_infer.json
│   ├── cls_bow_ch.json
│   ├── cls_ernie_3.0_xnli_ch_infer.json
│   ├── cls_ernie_3.0_xnli_ch.json
│   ├── cls_ernie_3.0_xnli_ch_save_infer_from_ckpt.json
│   ├── cls_ernie_fc_ch_infer.json
│   ├── cls_ernie_fc_ch.json
│   ├── cls_ernie_multi_label_ch_infer.json
│   └── cls_ernie_multi_label_ch.json
├── inference       ## 模型预测脚本
│   ├── custom_cls_inference_ernie3.py  
│   ├── custom_inference.py
│   └── __init__.py
├── model           ## 内置网络结构
│   ├── base_cls.py
│   ├── bow_classification.py      ## BOW网络结构
│   ├── ernie3_classification.py   ## ERNIE3.0在分类任务上的网络结构
│   ├── ernie_classification.py    ## ERNIE2.x在分类任务上的网络结构
│   └── multi_label_classification.py  ## 多标签分类任务的网络结构
├── reader
│   ├── categorical_field_reader.py
│   └── multi_label_field_reader.py
├── run_infer_ernie3.py
├── run_infer.py
├── run_trainer.py
└── trainer
    ├── custom_dynamic_trainer.py    ## ERNIE 2.X任务和非ERNIE任务的动态图训练脚本
    ├── custom_trainer_ernie3.py     ## ERNIE 3.0任务的静态图训练脚本(ERNIE3.0目前仅支持静态图训练)
    ├── custom_trainer.py    ## ERNIE 2.X任务和非ERNIE任务的静态图训练脚本
    └── __init__.py

准备数据

数据准备

选择ERNIE模型

参数配置

文心中的各种参数都是在json文件中进行配置的,您可以通过修改所加载的json文件来进行参数的自定义配置。json配置文件主要分为三个部分:dataset_reader(数据部分)、model(网络部分)、trainer或inference(执行部分),在模型训练的时候,json文件中需要配置dataset_reader、model和trainer这三个部分;在预测推理的时候,json文件中需要配置dataset_reader、inference这两个部分。这里以./examples/cls_bow_ch.json为例,上述三个部分的配置与说明如下所示。

  • dataset_reader

    用于配置模型训练或者预测时的数据相关配置,训练任务的dataset_reader中必须有train_reader、test_reader、dev_reader,预测推理任务的dataset_reader仅需要predict_reader。

{
"dataset_reader": {
  "train_reader": {   ## 训练、验证、测试各自基于不同的数据集,数据格式也可能不一样,可以在json中配置不同的reader,此处为训练集的reader。
    "name": "train_reader",
    "type": "BasicDataSetReader",  ## 采用BasicDataSetReader,其封装了常见的读取tsv、txt文件、组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",这里的取值是对应FieldReader的类名,关于各个FieldReader的区别详见http://wiki.baidu.com/display/TOne/6.Reader
        },
        "tokenizer": {
          "type": "CustomTokenizer",  ## 指定该文本域的tokenizer为CustomTokenizer,type的取值是对应Tokenizer的类名,关于各个Tokenizer的区别详见http://wiki.baidu.com/display/TOne/6.Reader
          "split_char": " ",  ## 非Ernie任务需要自己切词,切词之后的明文使用的分隔符在这里设置,默认是通过空格区分不同的token。
          "unk_token": "[UNK]",  ## unk标记为"[UNK]", 即词表之外的token所对应的默认id,unk必须是词表文件中存在的token。
          "params": null   ## 如果需要一些额外的参数传入tokenizer的时候可以使用该字段
        },
        "need_convert": true, ## "need_convert"true说明数据格式是明文字符串,需要通过词表转换为id。
        "vocab_path": "./dict/vocab.txt", ## 指定该文本域的词表,"need_convert"true时一定要设置
        "max_seq_len": 512,  ## 设定当前域转为id之后的最大长度
        "truncation_type": 0, ## 选择文本超长截断的策略,0为从头开始到最大长度截断,1为从头开始到max_len-1的位置截断,末尾补上最后一个id(词或字),2为保留头和尾两个位置,然后按从头开始到最大长度方式截断。
        "padding_id": 0  ## 设定padding时对应的id值,文心内部会按batch中的最长文本大小对整个batch中的数据进行padding补齐。
      },     ## 如果每一个样本有多个特征域(文本类型、数值类型均可),可以仿照前面对每个域进行设置,依次增加每个域的配置即可。此时样本的域之间是以\t分隔的。
      {
        "name": "label",   ## 标签也是一个单独的域,在当前例子中命名为"label"。如果多个不同任务体系的标签存在于多个域中,则可实现最基本的多任务学习。
        "data_type": "int",  ## 标签是整型数值。
        "reader": {
          "type": "ScalarFieldReader"   ## 整型数值域的reader为"ScalarFieldReader"},
        "tokenizer": null,   ## 如果你的label是明文文本,且需要分词的话,这里就需要配置对应的tokenizer,规则如上方文本域的tokenizer配置
        "need_convert": false,  ## "need_convert"true说明数据格式是明文字符串,需要通过词表转换为id。
        "vocab_path": "",  ## ”need_convert“为true的时候需要填词表路径    。
        "max_seq_len": 1,  ## 设定每个域的最大长度,当前例子中的label域是一个int数值,所以最大长度是1"truncation_type": 0,  ## 超过max_seq_len长度之后的截断策略,同上。
        "padding_id": 0,   ## 设定padding时对应的id值。
        "embedding": null   ## 历史遗留参数,设置为null即可。
      }
    ],
    "config": {
      "data_path": "./data/train_data",    ## 训练数据train_reader的数据路径,写到文件夹目录。
      "shuffle": false,   ## 数据在读取过程中是否需要打乱顺序。
      "batch_size": 8,    ## 超参数之一,表示每个step训练多少个样本。
      "epoch": 10,        ## 超参数之一,表示这个数据集中的数据会被重复训练多少轮。
      "sampling_rate": 1.0, ## 数据集的采样率,文心预留参数,暂时不起作用,后续版本会升级。
      "need_data_distribute": true, ## 表示数据读取过程中是否需要按卡数进行分发,true表示每张卡在同一个step中读取到的数据是不一样的,false表示每张卡在同一个step中读取到的数据是一样的,训练集默认为true,测试集、验证集、预测集都是false"need_generate_examples": false, ## 表示在数据读取过程中除了id化好的tensor数据外,是否需要返回原始明文样本,测试集默认取值为true,训练集、测试集、验证集为false
      "key_tag": false   ## ERNIE网络需要设置为true,非ERNIE网络需要设置为false
    }
  },
  "test_reader": {                                    ## 若要评估测试集,需配置test_reader,其配置方式与train_reader类似, 需要注意的是shuffle参数要设置为false,epoch参数必须是1。
  ……
  },
  "dev_reader": {      ## 若要评估验证集,需配置dev_reader,其配置方式与test_reader类似,需要注意的是shuffle参数要设置为false,epoch参数必须是1。
  ……
  },
  "predict_reader": {        ## 如果是预测推理,则必须配置predict_reader,其配置方式与train_reader、test_reader类似,需要注意的是predict_reader不需要label域,shuffle参数必须是false,epoch参数必须是1"name": "predict_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": null
          }
        ],
        "config": {
      "data_path": "./data/predict_data",
      "shuffle": false,        ## 注意!这里的参数必须关掉,打乱顺序输出之后不方便比对数据看结果
      "batch_size": 8,
      "epoch": 1,                            ## 注意!这里的epoch要设置为1,重复多次预测没意义。
      "sampling_rate": 1.0,
    "need_data_distribute": true,
    "need_generate_examples": false,
    "key_tag": false
}
……
}
  
  • model:用于配置模型训练时的预置网络,包括预置网络的类别及其优化器的参数等,以下为./examples/cls_bow_ch.json中抽取出来的model部分配置,并通过注释说明。
{
...
"model": {
  "type": "BowClassification",  ## 文心采用模型(models)的方式定义神经网络的基本操作,本例采用预置的模型BowClassification实现文本分类,具体网络可参考models目录。
  "is_dygraph": 1,             ## 区分动态图模型和静态图模型,1表示动态图,0表示静态图
  "optimization": {
    "learning_rate": 2e-05    ## 预置模型的优化器所需的参数配置,如学习率等。
  },
  "vocab_size": 33261,       ## 该模型(model)使用的词表大小,必填参数。
  "num_labels": 2            ## 该分类模型的类别数目是多少,必填参数,不填则默认是二分类
},
...
}

Ernie任务的model部分和非Ernie任务基本上一致,区别在于optimization(优化器)部分的参数配置了更多信息。以./examples/cls_ernie_fc_ch.json中的model部分为例说明。

{
...  ## 配置情况大体上与上述的非ERNIE BOW模型一致,仅标注不同的地方
"model": {
    "type": "ErnieClassification",  ## 对应的模型网络类名为
          "is_dygraph": 1,             
  "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参数设置,必填参数。
    "type": "ErnieTokenEmbedding",  ## embedding类型,务必设置为ErnieTokenEmbedding
    "emb_dim": 768,  ## 当前ERNIE模型的词向量维度,不同版本ERNIE维度不同,具体数值参考对应的config.json中的emb_size参数。
    "config_path": "../model_files/config/ernie_2.0_base_ch_config.json",  ## 当前ERNIE模型的配置文件,下载需要的ERNIE模型压缩包即可看到。
    "other": ""   ## 预留字段,用来传递一些额外信息。
  },
  "num_labels": 2
},
...
}
  • trainer:用于配置模型训练的启动器,包括保存模型时的间隔步数、进行测试集或验证集评估的间隔步数等。以下为/examples/cls_ernie_2.0_base_fc_ch.json中抽取出来的trainer部分配置,并通过注释说明。

    {
      ...
      "trainer": {
        "PADDLE_USE_GPU": 0,                               ## 是否使用GPU进行训练,1为使用GPU,同上。
        "PADDLE_IS_LOCAL": 1,                              ## 是否单机训练,默认值为0,若要单机训练需要设置为1,同上。
        "train_log_step": 20,                              ## 训练时打印训练日志的间隔步数,同上。
        "is_eval_dev": 0,                                  ## 是否在训练的时候评估开发集,如果取值为1,则一定需要配置dev_reader及其数据路径,同上。
        "is_eval_test": 1,                                 ## 是否在训练的时候评估测试集,如果取值为1,则一定需要配置test_reader及其数据路径,同上。
        "eval_step": 100,                                  ## 进行测试集或验证集评估的间隔步数,同上。
        "save_model_step": 10000,                          ## 保存模型时的间隔步数,建议设置为eval_step的整数倍,同上。
        "load_parameters": "",                             ## 加载包含各op参数值的训练好的模型,用于热启动。此处填写checkpoint路径。不填则表示不使用热启动,同上。
        "load_checkpoint": "",                             ## 加载包含学习率等所有参数的训练模型,用于热启动。此处填写checkpoint路径。不填则表示不使用热启动,同上。
        "use_fp16": 0,                                     ## 是否使用fp16精度(半精度),预留参数,请设置为0(文心目前对fp16精度的支持还在更新中,敬请关注),同上。
        "pre_train_model": [							   ## 加载预训练模型,ERNIE任务的必填参数,非ERNIE任务将当前参数置为[]即可。
    		{
      			"name": "ernie_2.0_base_ch",			   ## 预训练模型的名称name
      			"params_path": "../model_files/ernie_2.0_base_ch_dir/params"   ## 预训练模型的目录params_path
    		}
    	],                             
        "output_path": "./output/cls_cnn_ch"           ## 保存模型的输出路径,如置空或者不配置则默认输出路径为"./output",同上。
    	"extra_param": {								   ## 除核心必要信息之外,需要额外标明的参数信息,比如一些meta信息可以作为日志统计的关键字,同上。
      		"meta":{
        		"job_type": "text_classification"
      		}
    	}
      }
    }
  • inference:用于配置模型预测推理的启动器,包括待预测模型路径、结果输出等参数。
{
...
"inference": {
"output_path": "./output/predict_result.txt",  ## 预测结果的输出路径,如果不填则默认输出路径为"./output/predict_result.txt"
"PADDLE_PLACE_TYPE": "cpu",
"num_labels": 2,  ## 必填参数,表示分类模型的类别数目是多少,预测结果解析时会用到
"inference_model_path":   "./output/cls_bow_ch/save_inference_model/inference_step_251",  ## 待预测模型的路径
"extra_param": {  ## 同trainer,除核心必要信息之外,需要额外标明的参数信息,比如一些meta信息可以作为日志统计的关键字。
  "meta":{
    "job_type": "text_classification"
  }
}
}

开始训练

  • 如您使用镜像开发套件,您可直接进入下一步骤。如您将文心开发套件与本地已有的开发环境相结合,您需要在./env.sh中配置对应的环境变量,并执行source env.sh ,如需了解更多详情,请参考环境配置。
  • 模型训练的入口脚本为./run_trainer.py , 通过—param_path参数来传入./examples/目录下的json配置文件。例如:python run_trainer.py --param_path ./examples/cls_bow_ch.json
  • 训练运行的日志会自动保存在./log/test.log文件中.
  • 训练中以及结束后产生的模型文件会默认保存在./output/cls_bow_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/cls_bow_ch_infer.json
  • 预测运行的日志会自动保存在./output/predict_result.txt文件中。