数据集文档

构建和加载

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

构建和加载

几乎每个深度学习工作流程都始于加载数据集,这使其成为最重要的步骤之一。借助 🤗 Datasets,有超过 900 个数据集可供使用,帮助你开始 NLP 任务。你只需调用: load_dataset() 即可迈出第一步。这个函数在任何意义上都是一个真正的主力,因为它构建和加载你使用的每个数据集。

ELI5: load_dataset

让我们从一个基本的“像对我五岁小孩解释一样”开始。

数据集是一个目录,其中包含

  • 一些通用格式的数据文件 (JSON、CSV、Parquet、文本等)
  • 一个名为 README.md 的数据集卡片,其中包含关于数据集的文档以及定义数据集标签和配置的 YAML 标头
  • 一个可选的数据集脚本,如果它需要一些代码来读取数据文件。这有时用于加载特定格式和结构的文件。

load_dataset() 函数从本地或 Hugging Face Hub 获取请求的数据集。Hub 是一个中央仓库,其中存储了所有 Hugging Face 数据集和模型。

如果数据集仅包含数据文件,则 load_dataset() 会自动推断如何从其扩展名(json、csv、parquet、txt 等)加载数据文件。在底层,🤗 Datasets 将使用适当的 DatasetBuilder,基于数据文件格式。在 🤗 Datasets 中,每种数据文件格式都存在一个构建器

如果数据集具有数据集脚本,则它会从 Hugging Face Hub 下载并导入它。数据集脚本中的代码定义了一个自定义的 DatasetBuilder,其中包含数据集信息(描述、特征、原始文件的 URL 等),并告诉 🤗 Datasets 如何生成和显示示例。

阅读 分享 部分,了解更多关于如何分享数据集的信息。本节还提供了关于如何编写你自己的数据集加载脚本的分步指南!

🤗 Datasets 从原始 URL 下载数据集文件,生成数据集,并将其缓存到你驱动器上的 Arrow 表中。如果你之前下载过数据集,则 🤗 Datasets 将从缓存重新加载它,以节省你再次下载的麻烦。

现在你已经对数据集的构建方式有了高层次的理解,让我们更仔细地看看这一切是如何运作的细节。

构建数据集

当你首次加载数据集时,🤗 Datasets 会获取原始数据文件,并将其构建为行和类型化列的表格。有两个主要的类负责构建数据集:BuilderConfigDatasetBuilder

BuilderConfig

BuilderConfigDatasetBuilder 的配置类。BuilderConfig 包含关于数据集的以下基本属性

属性 描述
name 数据集的短名称。
version 数据集版本标识符。
data_dir 存储包含数据文件的本地文件夹的路径。
data_files 存储本地数据文件的路径。
description 数据集的描述。

如果想向数据集添加其他属性,例如类标签,你可以子类化基础 BuilderConfig 类。有两种方法可以填充 BuilderConfig 类或子类的属性

  • 在数据集的 DatasetBuilder.BUILDER_CONFIGS() 属性中提供预定义的 BuilderConfig 类(或子类)实例的列表。

  • 当你调用 load_dataset() 时,任何不特定于该方法的关键字参数都将用于设置 BuilderConfig 类的相关属性。如果选择了特定的配置,这将覆盖预定义的属性。

你还可以将 DatasetBuilder.BUILDER_CONFIG_CLASS 设置为 BuilderConfig 的任何自定义子类。

DatasetBuilder

DatasetBuilder 访问 BuilderConfig 内部的所有属性,以构建实际的数据集。

DatasetBuilder 中有三个主要方法

  1. DatasetBuilder._info() 负责定义数据集属性。当你调用 dataset.info 时,🤗 Datasets 会返回此处存储的信息。同样,Features 也在此处指定。请记住,Features 就像数据集的骨架。它提供了每列的名称和类型。

  2. DatasetBuilder._split_generator 下载或检索请求的数据文件,将它们组织成拆分,并为生成过程定义特定参数。此方法有一个 DownloadManager,用于下载文件或从本地文件系统获取文件。在 DownloadManager 中,有一个 DownloadManager.download_and_extract() 方法,它接受原始数据文件的 URL 字典,并下载请求的文件。接受的输入包括:单个 URL 或路径,或 URL 或路径的列表/字典。任何压缩文件类型(如 TAR、GZIP 和 ZIP 归档文件)都将自动解压缩。

    下载文件后,SplitGenerator 将它们组织成拆分。SplitGenerator 包含拆分的名称,以及提供给 DatasetBuilder._generate_examples 方法的任何关键字参数。关键字参数可以特定于每个拆分,并且通常至少包含每个拆分的数据文件的本地路径。

  3. DatasetBuilder._generate_examples 读取和解析拆分的数据文件。然后,它根据 DatasetBuilder._info()features 中指定的格式生成数据集示例。DatasetBuilder._generate_examples 的输入实际上是上一个方法的关键字参数中提供的 filepath

    数据集是使用 Python 生成器生成的,该生成器不会将所有数据加载到内存中。因此,生成器可以处理大型数据集。但是,在生成的样本刷新到磁盘上的数据集文件之前,它们会存储在 ArrowWriter 缓冲区中。这意味着生成的样本是按批次写入的。如果你的数据集样本消耗大量内存(图像或视频),请确保为 DatasetBuilder 中的 DEFAULT_WRITER_BATCH_SIZE 属性指定较低的值。我们建议不要超过 200 MB 的大小。

保持完整性

为了确保数据集完整,load_dataset() 将对下载的文件执行一系列测试,以确保一切都在那里。这样,你就不会在请求的数据集没有按预期生成时遇到任何意外。load_dataset() 验证

  • 生成的 DatasetDict 中的拆分数量。
  • 生成的 DatasetDict 的每个拆分中的样本数量。
  • 下载文件的列表。
  • 下载文件的 SHA256 校验和 (默认禁用)。

如果数据集未通过验证,则可能是数据集的原始主机对数据文件进行了一些更改。

如果是你自己的数据集,你需要重新计算上述信息并更新数据集仓库中的 README.md 文件。查看此部分,了解如何生成和更新此元数据。

在这种情况下,会引发错误以提醒数据集已更改。要忽略该错误,需要在 load_dataset() 中指定 verification_mode="no_checks"。每当你看到验证错误时,请随时在相应数据集的“社区”选项卡中打开讨论或拉取请求,以便更新该数据集的完整性检查。

安全性

Hub 上的数据集仓库会进行恶意软件扫描,更多信息请参阅此处

此外,没有命名空间的数据集(最初在我们 GitHub 仓库上贡献)都已由我们的维护人员审查。这些数据集的代码被认为是安全的。它涉及没有命名空间的数据集,例如“rajpurkar/squad”或“nyu-mll/glue”,与其他命名为“username/dataset_name”或“org/dataset_name”的数据集不同。

< > 在 GitHub 上更新