自定义数据

训练一个新任务时,如果从零开始训练时,这将是一个耗时的过程,并且效果可能达不到理想的效果,此时您可以利用PaddleHub提供的预训练模型进行具体任务的Fine-tune。您只需要对自定义数据进行相应的预处理,随后输入预训练模型中,即可得到相应的结果。

一、NLP类任务如何自定义数据

本文以预训练模型ERNIE对文本分类任务进行Fine-tune为例,说明如何利用PaddleHub适配自定义数据完成Fine-tune。

数据准备

  1. ├─data: 数据目录
  2. ├─train.tsv 训练集
  3. ├─dev.tsv 验证集
  4. ├─test.tsv 测试集
  5. └─……

相应的数据格式为第一列是文本内容text_a,第二列为文本类别label。列与列之间以Tab键分隔。数据集文件第一行为text_a label(中间以Tab键分隔)。

如果您有两个输入文本text_a、text_b,则第一列为第一个输入文本text_a, 第二列应为第二个输入文本text_b,第三列文本类别label。列与列之间以Tab键分隔。数据集第一行为text_a text_b label(中间以Tab键分隔)。

  1. text_a label
  2. 15.4寸笔记本的键盘确实爽,基本跟台式机差不多了,蛮喜欢数字小键盘,输数字特方便,样子也很美观,做工也相当不错 1
  3. 房间太小。其他的都一般。。。。。。。。。 0
  4. 1.接电源没有几分钟,电源适配器热的不行. 2.摄像头用不起来. 3.机盖的钢琴漆,手不能摸,一摸一个印. 4.硬盘分区不好办. 0

自定义数据加载

加载文本类自定义数据集,用户仅需要继承基类BaseNLPDatast,修改数据集存放地址以及类别即可。具体使用如下:

NOTE:

  • 数据集文件编码格式建议为utf8格式。

  • 如果相应的数据集文件没有上述的列说明,如train.tsv文件没有第一行的text_a label,则train_file_with_header=False。

  • 如果您还有预测数据(没有文本类别),可以将预测数据存放在predict.tsv文件,文件格式和train.tsv类似。去掉label一列即可。

  • 分类任务中,数据集的label必须从0开始计数

  1. from paddlehub.dataset.base_nlp_dataset import BaseNLPDataset
  2. class DemoDataset(BaseNLPDataset):
  3. """DemoDataset"""
  4. def __init__(self):
  5. # 数据集存放位置
  6. self.dataset_dir = "path/to/dataset"
  7. super(DemoDataset, self).__init__(
  8. base_path=self.dataset_dir,
  9. train_file="train.tsv",
  10. dev_file="dev.tsv",
  11. test_file="test.tsv",
  12. # 如果还有预测数据(不需要文本类别label),可以放在predict.tsv
  13. predict_file="predict.tsv",
  14. train_file_with_header=True,
  15. dev_file_with_header=True,
  16. test_file_with_header=True,
  17. predict_file_with_header=True,
  18. # 数据集类别集合
  19. label_list=["0", "1"])
  20. dataset = DemoDataset()

之后,您就可以通过DemoDataset()获取自定义数据集了。进而配合ClassifyReader以及预训练模型如ERNIE完成文本分类任务。

二、CV类任务如何自定义数据

利用PaddleHub迁移CV类任务使用自定义数据时,用户需要自己切分数据集,将数据集且分为训练集、验证集和测试集。

数据准备

需要三个文本文件来记录对应的图片路径和标签,此外还需要一个标签文件用于记录标签的名称。

  1. ├─data: 数据目录
  2. ├─train_list.txt:训练集数据列表
  3. ├─test_list.txt:测试集数据列表
  4. ├─validate_list.txt:验证集数据列表
  5. ├─label_list.txt:标签列表
  6. └─……

训练/验证/测试集的数据列表文件的格式如下

  1. 图片1路径 图片1标签
  2. 图片2路径 图片2标签
  3. ...

label_list.txt的格式如下

  1. 分类1名称
  2. 分类2名称
  3. ...

示例: 以DogCat数据集为示例,train_list.txt/test_list.txt/validate_list.txt内容如下示例

  1. cat/3270.jpg 0
  2. cat/646.jpg 0
  3. dog/12488.jpg 1

label_list.txt内容如下:

  1. cat
  2. dog

自定义数据加载

加载图像类自定义数据集,用户仅需要继承基类BaseCVDatast,修改数据集存放地址即可。具体使用如下:

NOTE:

  • 数据集文件编码格式建议为utf8格式。

  • dataset_dir为数据集实际路径,需要填写全路径,以下示例以/test/data为例。

  • 训练/验证/测试集的数据列表文件中的图片路径需要相对于dataset_dir的相对路径,例如图片的实际位置为/test/data/dog/dog1.jpg。base_path为/test/data,则文件中填写的路径应该为dog/dog1.jpg

  • 如果您还有预测数据(没有文本类别),可以将预测数据存放在predict_list.txt文件,文件格式和train_list.txt类似。去掉label一列即可

  • 如果您的数据集类别较少,可以不用定义label_list.txt,可以选择定义label_list=[“数据集所有类别”]。

  • 分类任务中,数据集的label必须从0开始计数

  1. from paddlehub.dataset.base_cv_dataset import BaseCVDataset
  2. class DemoDataset(BaseCVDataset):
  3. def __init__(self):
  4. # 数据集存放位置
  5. self.dataset_dir = "/test/data"
  6. super(DemoDataset, self).__init__(
  7. base_path=self.dataset_dir,
  8. train_list_file="train_list.txt",
  9. validate_list_file="validate_list.txt",
  10. test_list_file="test_list.txt",
  11. predict_file="predict_list.txt",
  12. label_list_file="label_list.txt",
  13. # label_list=["数据集所有类别"])
  14. dataset = DemoDataset()