Datasets 文档

构建与加载

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 中,每种数据文件格式都有一个对应的构建器:

阅读 分享 (Share) 部分以了解更多关于如何分享数据集的信息。

🤗 Datasets 从原始 URL 下载数据集文件,生成数据集并将其缓存到您驱动器上的 Arrow 表中。如果您之前下载过该数据集,则 🤗 Datasets 将从缓存中重新加载,以避免重复下载的麻烦。

现在您已经对数据集是如何构建的有了高层次的了解,让我们详细研究一下这一切运作的具体细节。

构建数据集

当您第一次加载数据集时,🤗 Datasets 会将原始数据文件构建成一个包含行和类型化列的表格。有两个主要的类负责构建数据集:BuilderConfigDatasetBuilder

BuilderConfig

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

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

如果您想为数据集添加额外的属性(例如类标签),您可以继承基础的 BuilderConfig 类。有两种方式可以填充 BuilderConfig 类或其子类的属性:

  • 在 datasets 的 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 下载或检索请求的数据文件,将其组织成拆分集(splits),并为生成过程定义特定的参数。该方法拥有一个 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 生成器(generator)生成,因此不会将所有数据加载到内存中。因此,生成器可以处理大型数据集。然而,在生成的样本被刷新到磁盘上的数据集文件之前,它们被存储在 ArrowWriter 缓冲区中。这意味着生成的样本是分批写入的。如果您的数据集样本占用大量内存(如图像或视频),请确保在 DatasetBuilder 中为 DEFAULT_WRITER_BATCH_SIZE 属性指定一个较低的值。我们建议大小不要超过 200 MB。

维护完整性

为了确保数据集的完整性,load_dataset() 将对下载的文件进行一系列测试,以确保所有内容都已就绪。这样,当请求的数据集未能按预期生成时,您就不会遇到意外情况。load_dataset() 会验证以下内容:

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

如果数据集未通过验证,很可能是数据集作者对数据文件进行了某些更改。

在这种情况下,系统会抛出一个错误以警示数据集已更改。要忽略此错误,需要在 load_dataset() 中指定 verification_mode="no_checks"。每当您看到验证错误时,请随时在相应数据集的 “Community” 选项卡中发起讨论或提交拉取请求(pull request),以便更新该数据集的完整性检查。

安全

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

在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.