Datasets 文档

预处理

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

预处理

除了加载数据集,🤗 Datasets 的另一个主要目标是提供多样化的预处理功能,使数据集以适合机器学习框架训练的格式呈现。

预处理数据集的方法有很多种,这完全取决于你的具体数据集。有时你可能需要重命名列,有时你可能需要展开嵌套字段。🤗 Datasets 提供了执行其中大多数操作的方法。但在几乎所有预处理情况下,根据你的数据集模态,你都需要

  • 对文本数据集进行分词。
  • 对音频数据集进行重采样。
  • 对图像数据集应用变换。

最后的预处理步骤通常是将数据集格式设置为与你的机器学习框架预期的输入格式兼容。

在本教程中,你还需要安装 🤗 Transformers 库

pip install transformers

选择一个你喜欢的数据集并跟随教程一起操作!

文本分词

模型无法处理原始文本,因此你需要将文本转换为数字。分词提供了一种方法,通过将文本分成称为 *tokens* 的单个词来实现这一点。Tokens 最终会被转换为数字。

查看 Hugging Face 课程第 2 章中的“分词器”部分,以了解有关分词和不同分词算法的更多信息。

1. 首先加载 rotten_tomatoes 数据集和与预训练 BERT 模型对应的分词器。使用与预训练模型相同的分词器非常重要,因为你要确保文本以相同的方式进行分割。

>>> from transformers import AutoTokenizer
>>> from datasets import load_dataset

>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")

2. 在数据集的第一行 text 上调用你的分词器

>>> tokenizer(dataset[0]["text"])
{'input_ids': [101, 1103, 2067, 1110, 17348, 1106, 1129, 1103, 6880, 1432, 112, 188, 1207, 107, 14255, 1389, 107, 1105, 1115, 1119, 112, 188, 1280, 1106, 1294, 170, 24194, 1256, 3407, 1190, 170, 11791, 5253, 188, 1732, 7200, 10947, 12606, 2895, 117, 179, 7766, 118, 172, 15554, 1181, 3498, 6961, 3263, 1137, 188, 1566, 7912, 14516, 6997, 119, 102], 
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

分词器返回一个包含三个项目的字典

  • input_ids:表示文本中 tokens 的数字。
  • token_type_ids:如果存在多个序列,则指示 token 属于哪个序列。
  • attention_mask:指示是否应屏蔽 token。

这些值实际上是模型的输入。

3. 对整个数据集进行分词的最快方法是使用 map() 函数。此函数通过将分词器应用于批量的示例而不是单个示例来加速分词。将 batched 参数设置为 True

>>> def tokenization(example):
...     return tokenizer(example["text"])

>>> dataset = dataset.map(tokenization, batched=True)

4. 设置数据集的格式以与你的机器学习框架兼容

Pytorch
隐藏 Pytorch 内容

使用 set_format() 函数将数据集格式设置为与 PyTorch 兼容

>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"])
>>> dataset.format['type']
'torch'
TensorFlow
隐藏 TensorFlow 内容

使用 to_tf_dataset() 函数将数据集格式设置为与 TensorFlow 兼容。你还需要从 🤗 Transformers 导入一个 data collator,以将不同的序列长度组合成长度相等的单个批次

>>> from transformers import DataCollatorWithPadding

>>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf")
>>> tf_dataset = dataset.to_tf_dataset(
...     columns=["input_ids", "token_type_ids", "attention_mask"],
...     label_cols=["label"],
...     batch_size=2,
...     collate_fn=data_collator,
...     shuffle=True
... )

5. 数据集现在已准备好用于你的机器学习框架的训练!

重采样音频信号

像文本数据集这样的音频输入需要分成离散的数据点。这被称为 *采样*;采样率告诉你每秒捕获多少语音信号。重要的是确保你的数据集的采样率与用于预训练你正在使用的模型的数据的采样率相匹配。如果采样率不同,则预训练模型在你的数据集上的表现可能不佳,因为它无法识别采样率的差异。

1. 首先加载 MInDS-14 数据集、Audio 特征以及与预训练 Wav2Vec2 模型对应的特征提取器

>>> from transformers import AutoFeatureExtractor
>>> from datasets import load_dataset, Audio

>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base-960h")
>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train")

2. 索引到数据集的第一行。当你调用数据集的 audio 列时,它会自动解码和重采样

>>> dataset[0]["audio"]
{'array': array([ 0.        ,  0.00024414, -0.00024414, ..., -0.00024414,
         0.        ,  0.        ], dtype=float32),
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
 'sampling_rate': 8000}

3. 阅读数据集卡片非常有用,可以为你提供有关数据集的大量信息。快速查看 MInDS-14 数据集卡片会告诉你采样率为 8kHz。同样,你可以从模型的模型卡片中获得有关模型的许多详细信息。Wav2Vec2 模型卡片说它是在 16kHz 的语音音频上采样的。这意味着你需要对 MInDS-14 数据集进行上采样,以匹配模型的采样率。

使用 cast_column() 函数并在 Audio 特征中设置 sampling_rate 参数以上采样音频信号。当你现在调用 audio 列时,它会被解码并重采样到 16kHz

>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16_000))
>>> dataset[0]["audio"]
{'array': array([ 2.3443763e-05,  2.1729663e-04,  2.2145823e-04, ...,
         3.8356509e-05, -7.3497440e-06, -2.1754686e-05], dtype=float32),
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
 'sampling_rate': 16000}

4. 使用 map() 函数将整个数据集重采样到 16kHz。此函数通过将特征提取器应用于批量的示例而不是单个示例来加速重采样。将 batched 参数设置为 True

>>> def preprocess_function(examples):
...     audio_arrays = [x["array"] for x in examples["audio"]]
...     inputs = feature_extractor(
...         audio_arrays, sampling_rate=feature_extractor.sampling_rate, max_length=16000, truncation=True
...     )
...     return inputs

>>> dataset = dataset.map(preprocess_function, batched=True)

5. 数据集现在已准备好用于你的机器学习框架的训练!

应用数据增强

你将对图像数据集执行的最常见的预处理是数据增强,这是一个向图像引入随机变化而不改变数据含义的过程。这可能意味着更改图像的颜色属性或随机裁剪图像。你可以自由使用任何你喜欢的数据增强库,🤗 Datasets 将帮助你将数据增强应用于你的数据集。

1. 首先加载 Beans 数据集、Image 特征以及与预训练 ViT 模型对应的特征提取器

>>> from transformers import AutoFeatureExtractor
>>> from datasets import load_dataset, Image

>>> feature_extractor = AutoFeatureExtractor.from_pretrained("google/vit-base-patch16-224-in21k")
>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train")

2. 索引到数据集的第一行。当你调用数据集的 image 列时,底层的 PIL 对象会自动解码为图像。

>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x7FE5A047CC70>

大多数图像模型都希望图像处于 RGB 模式。Beans 图像已经处于 RGB 模式,但如果你的数据集包含处于不同模式的图像,则可以使用 cast_column() 函数将模式设置为 RGB

>>> dataset = dataset.cast_column("image", Image(mode="RGB"))

3. 现在,你可以对图像应用一些变换。随意查看 torchvision 中提供的各种变换,并选择一个你想要试验的变换。此示例应用一个随机旋转图像的变换

>>> from torchvision.transforms import RandomRotation

>>> rotate = RandomRotation(degrees=(0, 90))
>>> def transforms(examples):
...     examples["pixel_values"] = [rotate(image) for image in examples["image"]]
...     return examples

4. 使用 set_transform() 函数来动态应用变换。当你索引到图像 pixel_values 时,变换会被应用,你的图像会被旋转。

>>> dataset.set_transform(transforms)
>>> dataset[0]["pixel_values"]

5. 数据集现在已准备好用于你的机器学习框架的训练!

< > 在 GitHub 上更新