【Python】科研代码学习:五 Data Collator,Datasets

本文介绍了DataCollator在PyTorch和Transformer库中的角色,特别是DefaultDataCollator和DataCollatorWithPadding,它们在训练集中进行数据批处理、填充和标签处理。此外,还讨论了Padding的作用以及Datasets库在数据加载和处理中的功能,包括load_dataset函数和各种任务特定的DataCollator实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Data Collator

  • HF官网API:Data Collator
    Transformers源码阅读:transformers data_collator小记
    提到输入训练集/验证集数据,就基本绕不开 Data Collator
    它的作用是将多个数据进行批处理(Batch),并转换成 train_dataset eval_dataset 相同的数据类型
  • 为了让它工作顺利,可能会做一些处理(padding / random masking
  • 但是我发现,在 Datasets 的一些API中,或者单独使用 Data Collator 的情况很少啊
    再仔细查看发现,其作用主要是 给 Trainer 的初始化创建提供了一个 Data Collator,让 Trainer 在训练和评估的时候会自己去对数据进行批处理或特殊处理
  • 下面看一下 Data Collator 里面的东西吧。

Default data collator

  • 首先,它是一个方法,首先
    输入类型,其实就是一个任意的列表 InputDataClass = NewType("InputDataClass", Any)
    然后可以指定用 pytorch / tensorflow / numpy 中的一个版本,大部分都是使用 pt
    在这里插入图片描述
  • 发现,首先他把 features 也就是输入通过 vars() 转成了字典
    然后它处理了标签,也就是 label label_ids
    看下API描述:
    label: handles a single value (int or float) per object
    label_ids: handles a list of values per object
    哦,就是单标签和多标签的区别。
    最后做了些类型转换,输出打包为 Dict[str, Any]
    在这里插入图片描述

DefaultDataCollator

  • 上面是一个函数,这里是一个类(需要实例化)
    调用它相当于调用了上述的函数
    在这里插入图片描述

DataCollatorWithPadding

  • 如果不知道 Padding的,可以看一下后面的补充知识
  • 这里看一下源码和参数含义
    需要提供 tokenizer,以及 padding 策略。其他过程和上述 DefaultDataCollator 差不多。
    在这里插入图片描述

Padding

  • 知乎:LLM padding 细节
    可以翻译成对齐吧
  • 简单来说就是,输入经过词嵌入后,产生的 List[int] 词嵌入数组长度不一致,很难进行并行处理
    我们通过把所有数组长度统一到其中最长的那个数组长度,也就是其中添加 tokenizer.pad_token 即可。
    例如 tokenizer(prompts, return_tensors="pt", padding=True) ,其中 attention_mask 中的 0 表示 padding
  • 但是 padding 会增加无用字符,浪费训练资源,所以还有其他不用 padding 的训练方式。
  • 其他的技术细节请参考上述知乎链接。

其他 Data Collator

  • 针对不同任务,也提供了不同的 Data Collator,看一眼吧:
    DataCollatorForTokenClassification:给token分类的
    DataCollatorForSeq2Seq:给s2s任务的
    DataCollatorForLanguageModeling:给LM用的,mlm 参数给 MLM任务使用
    DataCollatorForWholeWordMask:给LM用的,(used for language modeling that masks entire words)
    DataCollatorForPermutationLanguageModeling:给(permutation language modeling)用的

Datasets

  • HF官网API:Datasets
    前面介绍的都在 transformers 库里的,而这个是在 Datasets 库的
    主要功能就是从 HF 中加载与上传数据集,给 Audio,CV,NLP任务用途的。
  • 它比较简单,最主要的方法也就是下面这个

load_dataset

  • 来看一下源码
    它参数比较多,我就选择重要参数介绍吧。详细请去API查看
    path :数据集的名字(请去HF中查找)或本地路径(json, csv, text等格式)或数据集脚本( dataset script,一个py文件)
    split:默认 None,不划分训练集和测试集,最终直接返回一个 DatasetDict 。若指定 train / test / validation(这个真难找,图片在下方),则返回 Dataset 类型。
    data_dir:设置保存路径。
    在这里插入图片描述
    在这里插入图片描述
  • 看一下例子:
    通过HF加载数据集 (ds = dataset缩写,是一个规范)
from datasets import load_dataset
ds = load_dataset('rotten_tomatoes', split='train')

data_files = {'train': 'train.csv', 'test': 'test.csv'}
ds = load_dataset('namespace/your_dataset_name', data_files=data_files)
  • 通过本地加载数据集,通过 csv / json / loading_script 加载
from datasets import load_dataset
ds = load_dataset('csv', data_files='path/to/local/my_dataset.csv')

from datasets import load_dataset
ds = load_dataset('json', data_files='path/to/local/my_dataset.json')

from datasets import load_dataset
ds = load_dataset('path/to/local/loading_script/loading_script.py', split='train')
  • 如果通过自动下载后,可以使用下面方法来设置数据存储到本地目录
    通过 save_to_disk 存到本地后,需要使用 load_from_disk 加载
dataset.save_to_disk(dataset_dict_path='./data/ChnSentiCorp')
dataset = load_from_disk('./data/ChnSentiCorp')

其他一些基本操作

  • HuggingFace学习笔记(3) 数据集工具datasets
    参考上面的知乎笔记,可以学到一些内容:
    1)dataset = dataset['train'] 可以直接获得其中的训练子集
    2)Dataset 内核和 pandas.dataframe 差不多
    3)索引ds[i] 取出第 i 条记录
    4)排序sorted_ds = ds.sort("colum_name")
    5)打乱shuffled_ds = ds.shuffle(seed=42)
    6)采样ds.select([0,10,11,...]) 表示拿出哪些记录
    7)训练测试集拆分ds.train_test_split(test_size=0.1),即9:1拆成训练集与测试集
    8)重命名列ds.rename_column('bef', 'aft')
    9)删除列ds.remove_columns(['colum_name'])
    10)过滤dataset.filter(func)
    比如
def func(data):
    return data['text'].startswith('非常不错')
  • 11)遍历修改new_ds = ds.map(func),这个比较常用
    比如
def f(data):
    data['text'] = 'My sentence: ' + data['text']
    return data
  • 12)批处理加速:filter()、map()两个函数都支持批处理加速
    添加如下关键词即可,注意 num_proc 表示使用的进程数。
maped_datatset = dataset.map(function=f,
	batched=True,
	batch_size=1000,
	num_proc=4)
### Python 中的大语言模型迁移学习Python中实施大语言模型的迁移学习涉及几个关键步骤,这些步骤包括但不限于加载预训练模型、调整模型结构以适应特定任务以及微调模型参数。下面提供了一个具体的例子,展示了如何基于Hugging Face Transformers库执行迁移学习。 #### 安装必要依赖 为了开始,在环境中安装所需的软件包是必不可少的操作: ```bash pip install transformers torch datasets ``` #### 加载预训练模型 接下来,选择并加载适合目标任务的语言模型至关重要。这里选取一个多语言BERT作为基础模型来进行分类任务为例[^2]。 ```python from transformers import BertForSequenceClassification, BertTokenizerFast model_name = "bert-base-multilingual-cased" tokenizer = BertTokenizerFast.from_pretrained(model_name) model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2) # 假设二元分类问题 ``` #### 准备数据集 准备用于训练的数据集同样重要。这通常涉及到文本编码过程,即把原始文本转换成模型能够理解的形式。 ```python import pandas as pd from sklearn.model_selection import train_test_split from datasets import DatasetDict, load_dataset raw_datasets = load_dataset('csv', data_files={'train': 'path/to/train.csv', 'test': 'path/to/test.csv'}) def preprocess_function(examples): return tokenizer(examples['text'], truncation=True) tokenized_datasets = raw_datasets.map(preprocess_function, batched=True) small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select([i for i in list(range(100))]) small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select([i for i in list(range(20))]) data_collator = DataCollatorWithPadding(tokenizer=tokenizer) ``` #### 微调模型 一旦准备好数据集之后,就可以对选定的基础模型进行微调了。此阶段的目标是在新的领域内优化模型表现。 ```python from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir='./results', learning_rate=2e-5, per_device_train_batch_size=8, per_device_eval_batch_size=8, num_train_epochs=3, weight_decay=0.01, ) trainer = Trainer( model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_eval_dataset, tokenizer=tokenizer, data_collator=data_collator, ) trainer.train() ``` #### 测试与评估 完成上述操作后,最后一步是对新训练得到的模型进行全面评测,确保其具备良好的泛化能力。 ```python eval_results = trainer.evaluate() print(f"Evaluation results: {eval_results}") ``` 通过这种方式,可以有效地利用现有的大规模预训练模型,并针对具体应用场景做出适当调整,从而提高开发效率的同时也改善最终产品的质量[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值