transformers基础组件之Datasets
一:Datasets简介
datasets库是一个非常简单易用的数据集加载库,可以方便快捷的从本地或者HuggingFace Hub加载数据集。
二:Datasets基本使用
# 安装datasets库
pip install datasets
# 导入库
from datasets import *
2.1 加载在线数据集
# 括号内填写数据集在HuggingFace Hub中的名称
datasets = load_dataset("madao33/new-title-chinese")
2.2 加载数据集合集中的某一项任务
有的数据集针对不同的任务,有着不同的形式,加载数据集合集中的某一项任务。
boolq_dataset = load_dataset("super_glue", "boolq")
2.3 按照数据集划分进行加载
加载数据集中的训练集:
# 加载数据集中的训练集
dataset = load_dataset("madao33/new-title-chinese", split="train")
dataset
输出:
Dataset({
features: ['title', 'content'],
num_rows: 5850
})
加载数据集中的验证集:
# 加载数据集中的验证集
dataset = load_dataset("madao33/new-title-chinese", split="validation")
dataset
输出:
Dataset({
features: ['title', 'content'],
num_rows: 1679
})
加载训练集中的切片数据:
dataset = load_dataset("madao33/new-title-chinese", split="train[10:100]")
dataset
输出:
Dataset({
features: ['title', 'content'],
num_rows: 90
})
按照百分比加载数据集:
dataset = load_dataset("madao33/new-title-chinese", split="train[:50%]")
dataset
输出:
Dataset({
features: ['title', 'content'],
num_rows: 2925
})
分多次加载数据集:
dataset = load_dataset("madao33/new-title-chinese", split=["train[:50%]", "train[50%:]"])
dataset
输出:
[Dataset({
features: ['title', 'content'],
num_rows: 2925
}),
Dataset({
features: ['title', 'content'],
num_rows: 2925
})]
2.4 查看数据集
datasets = load_dataset("madao33/new-title-chinese")
datasets
输出:数据集字典DatasetDict,其中包括训练集和验证集。
DatasetDict({
train: Dataset({
features: ['title', 'content'],
num_rows: 5850
})
validation: Dataset({
features: ['title', 'content'],
num_rows: 1679
})
})
查看训练集中的第一条数据:
datasets["train"][0]
输出:
{'title': '望海。。',
'content': '近期,。。。才是明智之举。\n(作者系中国国际问题研究院国际战略研究所副所长)'}
利用切片操作查看训练集的前两条数据:
datasets["train"][:2]
输出:
{'title': ['望海。。', '大力推进高校治理能力建设'],
'content': ['近期。。才是明智之举。\n(作者系中国国际问题研究院国际战略研究所副所长)',
'在推进“双一流”高校建设进程中,我们要紧紧围绕为党育人、为国育才,找准问题、破解难题,以一流意识和担当精神,大力推进高校的治理能力建设。\n增强政治引领力。坚持党对高校工作的全面领导,始终把政治建设摆在首位,增强校党委的政治领导力,全面推进党的建设各项工作。落实立德树人根本任务,把培养社会主义建设者和接班人放在中心位置。紧紧抓住思想政治工作这条生命线,全面加强师生思想政治工作,推进“三全育人”综合改革,将思想政治工作贯穿学校教育管理服务全过程,努力让学生成为德才兼备、全面发展的人才。\n提升人才聚集力。人才是创新的核心要素,创新驱动本质上是人才驱动。要坚持引育并举,建立绿色通道,探索知名专家举荐制,完善“一事一议”支持机制。在大力支持自然科学人才队伍建设的同时,实施哲学社会科学人才工程。立足实际,在条件成熟的学院探索“一院一策”改革。创新科研组织形式,为人才成长创设空间,建设更加崇尚学术、更加追求卓越、更加关爱学生、更加担当有为的学术共同体。\n培养学生竞争力。遵循学生成长成才的规律培育人才,着力培养具有国际竞争力的拔尖创新人才和各类专门人才,使优势学科、优秀教师、优质资源、优良环境围绕立德树人的根本任务配置。淘汰“水课”,打造“金课”,全力打造世界一流本科教育。深入推进研究生教育综合改革,加强事关国家重大战略的高精尖急缺人才培养,建设具有国际竞争力的研究生教育。\n激发科技创新力。在国家急需发展的领域挑大梁,就要更加聚焦科技前沿和国家需求,狠抓平台建设,包括加快牵头“武汉光源”建设步伐,积极参与国家实验室建设,建立校级大型科研仪器设备共享平台。关键核心技术领域“卡脖子”问题,归根结底是基础科学研究薄弱。要加大基础研究的支持力度,推进理论、技术和方法创新,鼓励支持重大原创和颠覆性技术创新,催生一批高水平、原创性研究成果。\n发展社会服务力。在贡献和服务中体现价值,推动合作共建、多元投入的格局,大力推进政产学研用结合,强化科技成果转移转化及产业化。探索校城融合发展、校地联动发展的新模式,深度融入地方创新发展网络,为地方经济社会发展提供人才支撑,不断拓展和优化社会服务网络。\n涵育文化软实力。加快体制机制改革,优化学校、学部、学院三级评审机制,充分发挥优秀学者特别是德才兼备的年轻学者在学术治理中的重要作用。牢固树立一流意识、紧紧围绕一流目标、认真执行一流标准,让成就一流事业成为普遍追求和行动自觉。培育具有强大凝聚力的大学文化,营造积极团结、向上向善、干事创业的氛围,让大学成为吸引和留住一大批优秀人才建功立业的沃土,让敢干事、肯干事、能干事的人有更多的荣誉感和获得感。\n建设中国特色、世界一流大学不是等得来、喊得来的,而是脚踏实地拼出来、干出来的。对标一流,深化改革,坚持按章程办学,构建以一流质量标准为核心的制度规范体系,扎实推进学校综合改革,探索更具活力、更富效率的管理体制和运行机制,我们就一定能构建起具有中国特色的现代大学治理体系,进一步提升管理服务水平和工作效能。\n(作者系武汉大学校长)']}
利用切片操作查看训练集中title字段的前5条数据:
datasets["train"]["title"][:5]
输出:
['望海。。。',
'大力推进高校治理能力建设',
'坚持事业为上选贤任能',
'“大朋友”的话儿记心头',
'用好可持续发展这把“金钥匙”']
查看数据集中有哪些字段:
datasets["train"].column_names
输出:
['title', 'content']
查看数据集字段的详细信息:
datasets["train"].features
输出:
{'title': Value(dtype='string', id=None),
'content': Value(dtype='string', id=None)}
2.5 数据集划分
将数据集划分为训练集和测试集,测试集比例为10%:
dataset = datasets["train"]
dataset.train_test_split(test_size=0.1)
输出:数据集字典
DatasetDict({
train: Dataset({
features: ['title', 'content'],
num_rows: 5265
})
test: Dataset({
features: ['title', 'content'],
num_rows: 585
})
})
在分类数据集中,要确保类别的比例在划分后保持一致,这对于分类任务非常重要,以避免类别不平衡的问题。
dataset = boolq_dataset["train"]
dataset.train_test_split(test_size=0.1, stratify_by_column="label") # 分类数据集可以按照比例划分
输出:
DatasetDict({
train: Dataset({
features: ['question', 'passage', 'idx', 'label'],
num_rows: 8484
})
test: Dataset({
features: ['question', 'passage', 'idx', 'label'],
num_rows: 943
})
})
2.6 数据选取与过滤
选取数据集中指定索引的数据,组成一个新的数据集:
# 选取
datasets["train"].select([0, 1])
输出:
Dataset({
features: ['title', 'content'],
num_rows: 2
})
对数据集进行过滤,筛选出满足指定条件的数据,组成新的数据集:
# 过滤。筛选出title中包含“中国”的数据
filter_dataset = datasets["train"].filter(lambda example: "中国" in example["title"])
输出过滤后的数据集的前5条数据:
filter_dataset["title"][:5]
输出:
['聚焦两会,世界探寻中国成功秘诀',
'望海楼中国经济的信心来自哪里',
'“中国奇迹”助力世界减贫跑出加速度',
'和音瞩目历史交汇点上的中国',
'中国风采感染世界']
2.7 数据映射
定义一个函数,这个函数的功能是:将数据集中的所有数据的title字段的内容,前面加上前缀“Preifix“。
def add_prefix(example):
example["title"] = 'Prefix: ' + example["title"]
return example
对数据集进行数据映射,并查看处理后的前10条数据:
prefix_dataset = datasets.map(add_prefix)
prefix_dataset["train"][:10]["title"]
输出:
['Prefix: 望海。。',
'Prefix: 大力推进高校治理能力建设',
'Prefix: 坚持事业为上选贤任能',
'Prefix: “大朋友”的话儿记心头',
'Prefix: 用好可持续发展这把“金钥匙”',
'Prefix: 跨越雄关,我们走在大路上',
'Prefix: 脱贫奇迹彰显政治优势',
'Prefix: 拱卫亿万人共同的绿色梦想',
'Prefix: 为党育人、为国育才',
'Prefix: 净化网络语言']
数据映射结合tokenizer来对数据进行处理。
导入相应的包、加载tokenizer、定义处理数据的函数:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
def preprocess_function(example, tokenizer=tokenizer):
model_inputs = tokenizer(example["content"], max_length=512, truncation=True)
labels = tokenizer(example["title"], max_length=32, truncation=True)
# label就是title编码的结果
model_inputs["labels"] = labels["input_ids"]
return model_inputs
对数据集进行数据映射:
processed_datasets = datasets.map(preprocess_function)
processed_datasets
输出:
DatasetDict({
train: Dataset({
features: ['title', 'content', 'input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 5850
})
validation: Dataset({
features: ['title', 'content', 'input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 1679
})
})
在处理大规模数据时,可以使用批处理操作,这样处理起来更快:
processed_datasets = datasets.map(preprocess_function, batched=True)
也可以使用多进程来加速数据处理:
processed_datasets = datasets.map(preprocess_function, num_proc=4)
将数据处理为token之后,就可以删除原始内容的字段了,这样减少内存开销:
processed_datasets = datasets.map(preprocess_function, batched=True, remove_columns=datasets["train"].column_names)
processed_datasets
输出:少了之前的title和content字段
DatasetDict({
train: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 5850
})
validation: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 1679
})
})
2.8 保存与加载
将处理后的数据保存下来,下次使用时,直接加载就行,不需要再处理一遍。
保存数据:
processed_datasets.save_to_disk("./processed_data")
结果:
加载数据:
processed_datasets = load_from_disk("./processed_data")
processed_datasets
输出:
DatasetDict({
train: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 5850
})
validation: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 1679
})
})
三:加载本地数据集
3.1 直接加载文件作为数据集
方法1:
dataset = load_dataset("csv", data_files="./ChnSentiCorp_htl_all.csv", split="train")
dataset
输出:
Dataset({
features: ['label', 'review'],
num_rows: 7766
})
方法2:
dataset = Dataset.from_csv("./ChnSentiCorp_htl_all.csv")
dataset
输出:
Dataset({
features: ['label', 'review'],
num_rows: 7766
})
3.2 加载文件夹内某些文件作为数据集
data_files传入一个列表,列表中填写文件路径。
dataset = load_dataset("csv", data_files=["./all_data/ChnSentiCorp_htl_all.csv", "./all_data/ChnSentiCorp_htl_all copy.csv"], split='train')
3.3 通过预先加载的其他格式转换加载数据集
例1:将pandas处理后的数据加载为数据集
import pandas as pd
data = pd.read_csv("./ChnSentiCorp_htl_all.csv")
dataset = Dataset.from_pandas(data)
dataset
输出:
Dataset({
features: ['label', 'review'],
num_rows: 7766
})
例2:将List格式的数据加载为数据集
# List格式的数据需要内嵌{},明确数据字段
data = [{"text": "abc"}, {"text": "def"}]
# data = ["abc", "def"]
Dataset.from_list(data)
输出:
Dataset({
features: ['text'],
num_rows: 2
})
四:Dataset with DataCollator
我们之前在创建DataLoader时,传入的collate_fn是自己创建的,但是transformers内部有实现好的collate_fn, 可以直接使用。
from transformers import DataCollatorWithPadding
from torch.utils.data import DataLoader
dataset = load_dataset("csv", data_files="./ChnSentiCorp_htl_all.csv", split='train')
dataset = dataset.filter(lambda x: x["review"] is not None)
def process_function(examples):
# 先不填充,DataCollatorWithPadding会自己动态填充为当前批次的最大token数量
tokenized_examples = tokenizer(examples["review"], max_length=128, truncation=True)
tokenized_examples["labels"] = examples["label"]
return tokenized_examples
tokenized_dataset = dataset.map(process_function, batched=True, remove_columns=dataset.column_names)
collator = DataCollatorWithPadding(tokenizer=tokenizer)
dl = DataLoader(tokenized_dataset, batch_size=4, collate_fn=collator, shuffle=True)
五:对上次文本分类实例代码的改进
只需要对step2 加载数据、step3 创建Dataset、step4 划分数据集、step5 创建Dataloader这几部分代码进行改进即可
step2 加载数据、step3 创建Dataset 可以合并为一个步骤:加载数据集
dataset = load_dataset("csv", data_files="./ChnSentiCorp_htl_all.csv", split="train")
dataset = dataset.filter(lambda x: x["review"] is not None)
dataset
划分数据集:
datasets = dataset.train_test_split(test_size=0.1)
datasets
创建Dataloader:
import torch
tokenizer = AutoTokenizer.from_pretrained("hfl/rbt3")
def process_function(examples):
tokenized_examples = tokenizer(examples["review"], max_length=128, truncation=True)
tokenized_examples["labels"] = examples["label"]
return tokenized_examples
tokenized_datasets = datasets.map(process_function, batched=True, remove_columns=datasets["train"].column_names)
tokenized_datasets
from torch.utils.data import DataLoader
from transformers import DataCollatorWithPadding
trainset, validset = tokenized_datasets["train"], tokenized_datasets["test"]
trainloader = DataLoader(trainset, batch_size=32, shuffle=True, collate_fn=DataCollatorWithPadding(tokenizer))
validloader = DataLoader(validset, batch_size=64, shuffle=False, collate_fn=DataCollatorWithPadding(tokenizer))
后续代码不变。。。
可在这篇笔记中查看相关代码:transformers基础组件之Model-CSDN博客
更多推荐


所有评论(0)