构建和加载
几乎每个深度学习工作流程都从加载数据集开始,这使其成为最重要的步骤之一。使用 🤗 数据集,有超过 900 个数据集可帮助你开始你的 NLP 任务。你只需调用: load_dataset() 来迈出第一步。这个函数在各个方面都是一个真正的主力,因为它构建并加载你使用的每个数据集。
ELI5:load_dataset
让我们从一个基本的“像解释给五岁小孩一样”开始。
数据集是一个包含以下内容的目录:
- 一些通用格式的数据文件(JSON、CSV、Parquet、文本等)
- 一个名为
README.md
的数据集卡片,其中包含有关数据集的文档以及一个 YAML 头文件,用于定义数据集的标签和配置 - 如果需要一些代码来读取数据文件,则可以使用可选的数据集脚本。这有时用于加载特定格式和结构的文件。
The load_dataset() 函数从本地或 Hugging Face Hub 获取请求的数据集。Hub 是一个中央存储库,其中存储了所有 Hugging Face 数据集和模型。
如果数据集仅包含数据文件,则 load_dataset() 会自动推断如何根据其扩展名(json、csv、parquet、txt 等)加载数据文件。在后台,🤗 Datasets 将根据数据文件格式使用合适的 DatasetBuilder。在 🤗 Datasets 中,每个数据文件格式都有一个构建器。
- datasets.packaged_modules.text.Text 用于文本
- datasets.packaged_modules.csv.Csv 用于 CSV 和 TSV
- datasets.packaged_modules.json.Json 用于 JSON 和 JSONL
- datasets.packaged_modules.parquet.Parquet 用于 Parquet
- datasets.packaged_modules.arrow.Arrow 用于 Arrow(流式文件格式)
- datasets.packaged_modules.sql.Sql 用于 SQL 数据库
- datasets.packaged_modules.imagefolder.ImageFolder 用于图像文件夹
- datasets.packaged_modules.audiofolder.AudioFolder 用于音频文件夹
如果数据集具有数据集脚本,则会从 Hugging Face Hub 下载并导入它。数据集脚本中的代码定义了一个自定义的 DatasetBuilder,其中包含数据集信息(描述、特征、原始文件的 URL 等),并告诉 🤗 Datasets 如何从中生成和显示示例。
阅读 分享 部分以了解有关如何共享数据集的更多信息。本节还提供了一个有关如何编写自己的数据集加载脚本的分步指南!
🤗 Datasets 从原始 URL 下载数据集文件,生成数据集并将其缓存在驱动器上的 Arrow 表中。如果您之前下载过数据集,则 🤗 Datasets 将从缓存中重新加载它,以避免您再次下载的麻烦。
现在您已经对数据集的构建方式有了高级的了解,让我们更仔细地看看所有这些是如何工作的。
构建数据集
当您第一次加载数据集时,🤗 Datasets 会获取原始数据文件并将其构建成一个包含行和类型化列的表。有两个主要类负责构建数据集:BuilderConfig 和 DatasetBuilder。
BuilderConfig
BuilderConfig 是 DatasetBuilder 的配置类。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 中有三个主要方法
DatasetBuilder._info()
负责定义数据集属性。当您调用dataset.info
时,🤗 Datasets 会返回此处存储的信息。同样,Features 也在此处指定。请记住,Features 就像数据集的骨架。它提供每一列的名称和类型。DatasetBuilder._split_generator
下载或检索请求的数据文件,将其组织成拆分,并为生成过程定义特定参数。此方法具有一个 DownloadManager,用于下载文件或从本地文件系统中获取文件。在 DownloadManager 中,有一个 DownloadManager.download_and_extract() 方法,它接受一个包含原始数据文件 URL 的字典,并下载请求的文件。可接受的输入包括:单个 URL 或路径,或 URL 或路径的列表/字典。任何压缩文件类型(如 TAR、GZIP 和 ZIP 存档)都将自动解压缩。下载文件后,SplitGenerator 会将其组织成拆分。SplitGenerator 包含拆分的名称,以及提供给
DatasetBuilder._generate_examples
方法的任何关键字参数。关键字参数可以特定于每个拆分,并且通常至少包含每个拆分的数据文件的本地路径。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"
。 任何时候看到验证错误,都可以随时在相应数据集的“社区”选项卡中打开讨论或提交请求,以便更新该数据集的完整性检查。
安全
集线器上的数据集存储库会扫描恶意软件,更多信息请点击此处。
此外,没有命名空间的数据集(最初贡献到我们的 GitHub 存储库)都已由我们的维护人员审查。这些数据集的代码被认为是安全的。它涉及没有命名空间的数据集,例如“squad”或“glue”,与其他命名为“用户名/数据集名称”或“组织/数据集名称”的数据集不同。
< > GitHub 更新