【Transformers基础入门篇5】基础组件之Datasets

文章目录

  • 一、简介
  • 二、Datasets基本使用
    • 2.1 加载在线数据集(load_dataset)
    • 2.2 加载数据集某一项任务(load_dataset)
    • 2.3 按照数据集划分进行加载(load_dataset)
    • 2.4 查看数据集(index and slice)
      • 2.4.1 加载数据
      • 2.4.2 查看数据集中的第i条
      • 2.4.3 仅查看某字段的的前2条
      • 2.4.4 看数据里包含哪几个字段(表头)
      • 2.4.5 查看标头有具体的特征
    • 2.5 数据集划分(train_test_split)
      • 2.5.1 train_test_split函数自动划分
      • 2.5.2 按照标签均衡划分
    • 2.6 数据选取与过滤(select and filter)
    • 2.7 数据映射(map)
      • 2.7.1 普通映射
      • 2.7.2 多batch映射和多线程映射
      • 2.7.3 去除原始字段
    • 2.8 保存与加载(save_to_disk/load_from_disk)
  • 三、Datasets 加载本地数据集
    • 3.1 直接加载文件作为数据集
    • 3.2 加载文件夹内全部文件作为数据集
    • 3.3 通过预先加载的其他格式 转换加载数据集
    • 3.4 通过自定义加载脚本加载数据集
      • 3.4.1 自己写加载脚本
  • 四、DataCollator
    • 4.1 负杂的写法,通过自己写collec funtion或者map
    • 4.2 简单的方法,直接运用Datacollator


本文为 https://space.bilibili.com/21060026/channel/collectiondetail?sid=1357748的视频学习笔记

项目地址为:https://github.com/zyds/transformers-code


一、简介

  • dataset库是一个非常简单易用的数据集加载库,可以方便快捷的从本地或者HuggingFace Hub加载数据集
  • 公开数据集地址: https://huggingface.co/datasets
  • 文档地址:https://huggingface.co/docs/datasets/index

二、Datasets基本使用

2.1 加载在线数据集(load_dataset)

尝试一个中文标题数据集 https://huggingface.co/datasets/madao33/new-title-chinese

from datasets import load_dataset
datasets = load_dataset("../../data/madao33/new-title-chinese")
datasets

输出是一个DatasetDict,包含了train和validation,每个数据集包含features(指有哪些字段)
在这里插入图片描述

2.2 加载数据集某一项任务(load_dataset)

如glue,不是一个任务,而是一个任务的集合。 数据集地址https://huggingface.co/datasets/nyu-mll/glue
在这里插入图片描述
让我们下载到本地:

git clone https://huggingface.co/datasets/nyu-mll/glue
# 这里第二个参数就是具体的数据集
glue_dataset = load_dataset("../../data/glue", "cola")
glue_dataset

输出如下:
在这里插入图片描述

2.3 按照数据集划分进行加载(load_dataset)

如2.2,已经将数据集分成train、validation和test,我们也可以指定train
通过split参数

# 仅加载train
dataset = load_dataset("../../data/madao33/new-title-chinese", split="train")
# 加载 10-100条
dataset = load_dataset("../../data/madao33/new-title-chinese", split="train[10:100]")
# 加载前50%,注意只能写百分数,不能写小数
dataset = load_dataset("../../data/madao33/new-title-chinese", split="train[:50%]")
# 加载训练集的50%,验证集的前10%
# 加载训练集的50%,验证集的前10%
dataset = load_dataset("../../data/madao33/new-title-chinese", split=["train[:50%]", "validation[50%:]"])

2.4 查看数据集(index and slice)

2.4.1 加载数据

datasets = load_dataset("../../data/madao33/new-title-chinese")
datasets

2.4.2 查看数据集中的第i条

# 查看数据集中的第0条,以dict返回
datasets["train"][0]
# 查看数据集中的前2条,还是会以Dict的形式返回,每个字段里是一个list 
datasets["train"][:2]

输出如下:
在这里插入图片描述

2.4.3 仅查看某字段的的前2条

# 仅title字段的的前2条
datasets["train"]["title"][:5]

输出如下:
在这里插入图片描述

2.4.4 看数据里包含哪几个字段(表头)

# 看数据里包含哪几个字段
datasets["train"].column_names

2.4.5 查看标头有具体的特征

# 查看标有的具体特征
datasets["train"].features

输出如下:值的类型都是string
在这里插入图片描述

2.5 数据集划分(train_test_split)

2.5.1 train_test_split函数自动划分

dataset = datasets["train"]
# 指定划分的比例
dataset.train_test_split(test_size=0.1)

2.5.2 按照标签均衡划分

比如分类问题,希望标签是均衡的

dataset.train_test_split(test_size=0.1, stratify_by_column="label")     # 分类数据集可以按照比例划分

2.6 数据选取与过滤(select and filter)

取的数据,还作为一个Dataset。 和查看数据不一样,查看数据返回的是一个Dict

# 选取
datasets["train"].select([0, 1])
# 过滤,过滤后的结果需要一个值来接收,操作不是一个inplace,而是拷贝出一个副本
filter_dataset = datasets["train"].filter(lambda example: "中国" in example["title"])

2.7 数据映射(map)

数据处理一般会结合数据映射的方法,我们可以定义一个函数,对每个数据进行处理。
比如这里,对每条数据增加一个prefix,然后进行返回

def add_prefix(example):example["title"] = 'Prefix: ' + example["title"]return example
# 然后将函数传进来
prefix_dataset = datasets.map(add_prefix)
prefix_dataset["train"][:10]["title"]

一般数据处理会有tokenizer

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("../../models/hfl/rbt3")
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

2.7.1 普通映射

processed_datasets = datasets.map(preprocess_function)

2.7.2 多batch映射和多线程映射

# 多batch映射
processed_datasets = datasets.map(preprocess_function, batched=True)
# 多线程映射
processed_datasets = datasets.map(preprocess_function, num_proc=4)

2.7.3 去除原始字段

# 去除原始字段
processed_datasets = datasets.map(preprocess_function, batched=True, remove_columns=datasets["train"].column_names)

2.8 保存与加载(save_to_disk/load_from_disk)

# 序列化保存到本地
processed_datasets.save_to_disk("./processed_data")
# 反序列化加载
processed_datasets = load_from_disk("./processed_data")

三、Datasets 加载本地数据集

3.1 直接加载文件作为数据集

如果本地数据集比较规范,比如csv文件

# 没有split,返回DataSetDict. 因为本地只有一个文件
dataset = load_dataset("csv", data_files="./ChnSentiCorp_htl_all.csv")
# 没有split,返回DataSetDict. 则返回一个纯粹的dataset
dataset = load_dataset("csv", data_files="./ChnSentiCorp_htl_all.csv", split="train")
# 用from_csv来加载,结果和load_dataset是一样的
dataset = Dataset.from_csv("./ChnSentiCorp_htl_all.csv")

3.2 加载文件夹内全部文件作为数据集

# 加载文件夹中所有的文件
dataset = load_dataset("csv", data_dir=["./all_data/", "./all_data/ChnSentiCorp_htl_all copy.csv"], split='train')
# 加载 指定的多个文件
dataset = load_dataset("csv", data_files=["./all_data/ChnSentiCorp_htl_all.csv", "./all_data/ChnSentiCorp_htl_all copy.csv"], split='train')

3.3 通过预先加载的其他格式 转换加载数据集

如dict、pandas、list

import pandas as pd
data = pd.read_csv("./ChnSentiCorp_htl_all.csv")
data.head()
dataset = Dataset.from_pandas(data)

注意,list不能直接加载,需要明确一下数据字段

# List格式的数据需要内嵌{},明确数据字段
data = [{"text": "abc"}, {"text": "def"}]
# data = ["abc", "def"]
Dataset.from_list(data)

3.4 通过自定义加载脚本加载数据集

# filed 指限定某个字段的数据
load_dataset("json", data_files="./cmrc2018_trial.json", field="data")

3.4.1 自己写加载脚本

# 也可以自己写加载脚本
dataset = load_dataset("./load_script.py", split="train")

load_script的实现
首先需要定义一个类,类继承 datasets.GeneratorBasedBuilder

class CMRC2018TRIAL(datasets.GeneratorBasedBuilder):

,然后实现三个抽象方法

  • _info(self) -> DatasetInfo: info方法, 定义数据集的信息,这里要对数据的字段进行定义:

  • _split_generators(self, dl_manager: DownloadManager): 返回一个list,List里放着datasets.SplitGenerator,涉及两个参数: namegen_kwargs
    name: 指定数据集的划分
    gen_kwargs: 指定要读取的文件的路径, 与_generate_examples的入参数一致

  • _generate_examples(self, filepath): 生成具体的样本, 使用yield
    需要额外指定key, id从0开始自增就可以. 注意,返回的必须是一个tuple。

load_script.py 完整实现如下:

import json
import datasets
from datasets import DownloadManager, DatasetInfoclass CMRC2018TRIAL(datasets.GeneratorBasedBuilder):def _info(self) -> DatasetInfo:"""info方法, 定义数据集的信息,这里要对数据的字段进行定义:return:"""return datasets.DatasetInfo(description="CMRC2018 trial",features=datasets.Features({"id": datasets.Value("string"),"context": datasets.Value("string"),"question": datasets.Value("string"),# answers 包括text和answer_start两个字段,还需要datasets.features.Sequence"answers": datasets.features.Sequence({"text": datasets.Value("string"),"answer_start": datasets.Value("int32"),})}))def _split_generators(self, dl_manager: DownloadManager):"""返回datasets.SplitGenerator涉及两个参数: name和gen_kwargsname: 指定数据集的划分gen_kwargs: 指定要读取的文件的路径, 与_generate_examples的入参数一致:param dl_manager::return: [ datasets.SplitGenerator ]"""return [datasets.SplitGenerator(name=datasets.Split.TRAIN, gen_kwargs={"filepath": "./cmrc2018_trial.json"})]def _generate_examples(self, filepath):"""生成具体的样本, 使用yield需要额外指定key, id从0开始自增就可以:param filepath::return:"""# Yields (key, example) tuples from the datasetwith open(filepath, encoding="utf-8") as f:data = json.load(f)for example in data["data"]:for paragraph in example["paragraphs"]:context = paragraph["context"].strip()for qa in paragraph["qas"]:question = qa["question"].strip()id_ = qa["id"]answer_starts = [answer["answer_start"] for answer in qa["answers"]]answers = [answer["text"].strip() for answer in qa["answers"]]yield id_, {"context": context,"question": question,"id": id_,"answers": {"answer_start": answer_starts,"text": answers,},}

四、DataCollator

4.1 负杂的写法,通过自己写collec funtion或者map

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):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)

4.2 简单的方法,直接运用Datacollator

transformers 提供了一些预制的Datacollator

collator = DataCollatorWithPadding(tokenizer=tokenizer)
dl = DataLoader(tokenized_dataset, batch_size=4, collate_fn=collator, shuffle=True)
num = 0
for batch in dl:print(batch["input_ids"].size())num += 1if num > 10:break

输出如下,可以看到一个批次里数据都没有这么长。 这样每个batch都会去最长的字段,可以节省一些计算资源。
在这里插入图片描述
但有一点需要注意,如果我们自己的数据里。除了input_ids、token_type_ids、attention_mask、labels外,我们还有其他的自定义的自读含,就不要用官方的 datacollector了(没法对其他字段做padding)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544730.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据库课程 CMU15-445 2023 Fall Project-2 Extendible Hash Index

0 实验结果 tips:完成项目的前提不需要一定看视频 1 数据结构:扩展哈希 解释下这张图: 图中header的最大深度2,directory最大深度2,桶的容量2。 最开始的时候只有一个header。 插入第一个数据,假设这个数据对应的哈希…

洛汗2保姆级辅助教程攻略:VMOS云手机辅助升级打怪!

在《洛汗2》中,玩家将进入一个充满魔幻色彩的西方世界,体验多种族文明的兴衰与冒险。为了更好地享受这款由普雷威(Playwith)开发的角色扮演动作手游,使用VMOS云手机将是一个明智的选择。VMOS云手机专为游戏打造了定制版…

基于SSM的“在线CRM管理系统”的设计与实现(源码+数据库+文档+开题报告)

基于SSM的“在线CRM管理系统”的设计与实现(源码数据库文档开题报告) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 总体功能模块图 登录页面 后台管理页面 产品信息页面 客…

JSP(Java Server Pages)基础使用二

简单练习在jsp页面上输出出乘法口诀表 既然大家都是来看这种代码的人了&#xff0c;那么这种输出乘法口诀表的这种简单算法肯定是难不住大家了&#xff0c;所以这次主要是来说jsp的使用格式问题。 <%--Created by IntelliJ IDEA.User: ***Date: 2024/7/18Time: 11:26To ch…

consul注册中心与容器自动发现实战

consul简介 Consul 是 HashiCorp 公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案&#xff0c;不再需要依赖其它工具&#xff08;比如 ZooKeeper 等&#xff0…

拾色器的取色的演示

前言 今天&#xff0c;有一个新新的程序员问我&#xff0c;如何确定图片中我们需要选定的颜色范围。一开始&#xff0c;我感到对这个问题很不屑。后来&#xff0c;想了想&#xff0c;还是对她说&#xff0c;你可以参考一下“拾色器”。 后来&#xff0c;我想关于拾色器&#…

动态规划11,完全背包模板

NC309 完全背包 问题一&#xff1a;求这个背包至多能装多大价值的物品&#xff1f; 状态表示&#xff1a;经验题目要求 dp[i][j] 表示 从前i个物品中挑选&#xff0c;总体积不超过j&#xff0c;所有选法中&#xff0c;能选出来的最大价值。 状态转移方程 根据最后一步的状态&a…

C语言 typedef - C语言零基础入门教程

目录 一.typedef 简介 二.typedef 实战 1.typedef 定义基本数据变量 2.typedef 定义结构体 A.常规定义结构体B.typedef 定义结构体C.结构体使用 typedef 和不使用 typedef 区别 3.typedef 定义函数指针 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础…

【2024W33】肖恩技术周刊(第 11 期):猴哥,我好急啊!

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

YOLOv9改进 | 特征融合篇,YOLOv9添加iAFF(多尺度通道注意力模块),二次创新RepNCSPELAN4结构,提升小目标检测能力

摘要 特征融合,即来自不同层或分支的特征的组合,是现代网络架构中无处不在的一部分。虽然它通常通过简单的操作(如求和或拼接)来实现,但这种方式可能并不是最佳选择。在这项工作中,提出了一种统一且通用的方案,即注意力特征融合(Attentional Feature Fusion),适用于…

C++ std::any升级为SafeAny

std::any测试 #include <any>class A { public:int8_t a; };int main(int argc, char* argv[]) {std::any num((int8_t)42);auto a std::any_cast<A>(num);return 0; }异常&#xff1a; 0x00007FFA9385CD29 处(位于 test.exe 中)有未经处理的异常: Microsoft C 异…

网络威慑战略带来的影响

文章目录 前言一、网络威慑的出现1、人工智能带来的机遇二、网络空间的威慑困境1、威慑概念的提出2、网络威慑的限度3、人类对网络威胁的认知变化4、网络空间的脆弱性总结前言 网络威慑是国家为应对网络空间风险和威胁而采取的战略。冷战时期核威慑路径难以有效复制至网络空间…

AI大模型行业应用:企业如何走出一条智能化蜕变之路?

随着chatGPT的横空问世&#xff0c;我们对于人工智能在日常生活中的应用场景逐渐了解&#xff0c;无论是搜索、问答、文生图还是文生视频都出现了很多创意&#xff0c;甚至AI还可以做诗&#xff0c;输入一条指令&#xff0c;就可以让它当场赋诗一首。人工智能的发展&#xff0c…

五种方式帮你提升独立站销售额

想要提升独立站利润&#xff0c;一种方式就是降低你的单个购买用户成本&#xff0c;购买用户一方面是来源于广告引流&#xff0c;另一方面是自然流量和老用户复购&#xff0c;但许多新的独立站后者来源都是非常少的&#xff0c;比较依赖广告引流&#xff0c;当我们广告的单个用…

Splunk、Snort在入侵检测中的应用

前期准备 splunk环境验证 splunk相关命令 查看服务端采集了哪些客户端的日志&#xff1a; ./bin/splunk list deploy-clients Deployment client: CF787A85-1BF8-4460-9FA9-469FEEB95BCD applications: {_server_app_39.30: {action: Install, archive: /home/splunk/var/ru…

ChatGPT 诞生663天后,奥特曼罕见发表预言长文力推超级智能:时间不多了,还有不会使用chatgpt4请看文章开头?

还不知道怎么订阅chatgpt4.0和最新的大模型&#xff0c;可以看这里 &#xff1a;WildCard官方平台订阅chatgpt 今天&#xff0c;OpenAI 公司 CEO 山姆奥特曼在一篇题为《智能时代》的最新个人博文中&#xff0c;概述了自己对于 AI 驱动的技术进步与全球繁荣未来的愿景。这篇文…

用Swift实现验证回文字符串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#…

深度学习500问——Chapter14:超参数调整(3)

文章目录 14.5 如何改善GAN的性能 14.6 AutoML 14.6.1 什么是AutoML 14.6.2 自动化超参数搜索方法有哪些 14.6.3 什么是神经网络架构搜索&#xff08;NAS&#xff09; 14.6.4 NASNet的设计策略 14.6.5 网络设计中&#xff0c;为什么卷积核设计尺寸都是奇数 14.6.6 网络设计中&a…

一文详解GB28181、RTSP、RTMP

GB28181 GB28181 即 GB/T28181—2016《公共安全视频监控联网系统信息传输、交换、控制技术要求》。它是公安部提出的公共安全行业标准&#xff0c;在视频监控领域具有重要地位。 主要目的和应用场景&#xff1a; 目的&#xff1a;解决不同厂家的视频监控设备执行各自标准&…

相交链表 -------------应用

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…