Datasets 文档

预处理

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

预处理

除了加载数据集外,🤗 Datasets 的另一个主要目标是提供一组多样化的预处理函数,以便将数据集转换为适合您机器学习框架训练的适当格式。

预处理数据集有许多可能的方法,这完全取决于您的具体数据集。有时您可能需要重命名列,而其他时候您可能需要展开嵌套字段。🤗 Datasets 提供了一种执行大多数此类操作的方法。但在几乎所有的预处理场景中,根据您数据集的模态,您将需要:

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

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

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

pip install transformers

选择一个您喜欢的数据集并开始实践吧!

文本分词

模型无法处理原始文本,因此您需要将文本转换为数字。分词(Tokenization)通过将文本拆分为称为 tokens 的单个词来实现这一点。最后,tokens 被转换为数字。

请查看 Hugging Face 课程第 2 章中的 Tokenizers 章节,以详细了解分词及其不同的分词算法。

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 是否应该被遮蔽(masked)。

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

3. 对整个数据集进行分词最快的方法是使用 map() 函数。该函数通过将分词器应用于批次(batches)示例而非单个示例来加速分词。将 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. 现在数据集已准备好使用您的机器学习框架进行训练!

音频信号重采样

与文本数据集一样,音频输入需要被划分为离散的数据点。这被称为 采样(sampling);采样率告诉您每秒捕捉多少语音信号。确保数据集的采样率与用于预训练模型的数据采样率一致非常重要。如果采样率不同,预训练模型在您的数据集上可能会表现不佳,因为它无法识别采样率带来的差异。

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 列时,它会自动被解码并重采样

>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_rate
8000

3. 阅读数据集卡片(dataset card)非常有用,可以为您提供大量关于数据集的信息。快速查看 MInDS-14 数据集卡片可知其采样率为 8kHz。同样,您可以通过模型卡片获取模型的许多细节。Wav2Vec2 模型卡片显示它是在 16kHz 的语音音频上采样的。这意味着您需要对 MInDS-14 数据集进行上采样,以匹配模型的采样率。

使用 cast_column() 函数并在 Audio 特征中设置 sampling_rate 参数来对音频信号进行上采样。现在调用 audio 列时,它将被解码并重采样为 16kHz

>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16_000))
>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_rate
16000

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

>>> def preprocess_function(examples):
...     audio_arrays = [x.get_all_samples().data 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. 现在数据集已准备好使用您的机器学习框架进行训练!

应用数据增强

您在图像数据集上最常做的预处理是 数据增强(data augmentation),这是一个在不改变数据含义的情况下为图像引入随机变化的过程。这可以是改变图像的颜色属性或随机裁剪图像。您可以自由使用任何喜欢的数据增强库,🤗 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. 现在让我们为图像应用数据增强。🤗 Datasets 可与任何增强库配合使用,在本例中我们将使用 Albumentations。

Albumentations 是一个流行的图像增强库,它提供了 丰富的变换集,包括空间级变换、像素级变换和混合级变换。

安装 Albumentations

pip install albumentations

4. 使用 Albumentations 创建一个典型的增强流水线

>>> import albumentations as A
>>> import numpy as np
>>> from PIL import Image

>>> transform = A.Compose([
...     A.RandomCrop(height=256, width=256, pad_if_needed=True, p=1),
...     A.HorizontalFlip(p=0.5),
...     A.ColorJitter(p=0.5)
... ])

5. 由于 🤗 Datasets 使用 PIL 图像,而 Albumentations 期望 NumPy 数组,因此您需要在两种格式之间进行转换

>>> def albumentations_transforms(examples):
...     # Apply Albumentations transforms
...     transformed_images = []
...     for image in examples["image"]:
...         # Convert PIL to numpy array (OpenCV format)
...         image_np = np.array(image.convert("RGB"))
...         
...         # Apply Albumentations transforms
...         transformed_image = transform(image=image_np)["image"]
...         
...         # Convert back to PIL Image
...         pil_image = Image.fromarray(transformed_image)
...         transformed_images.append(pil_image)
...     
...     examples["pixel_values"] = transformed_images
...     return examples

6. 使用 with_transform() 应用变换

>>> dataset = dataset.with_transform(albumentations_transforms)
>>> dataset[0]["pixel_values"]

在 🤗 Datasets 中使用 Albumentations 的关键点

  • 在应用变换之前将 PIL 图像转换为 NumPy 数组
  • Albumentations 返回一个字典,变换后的图像位于 “image” 键下
  • 变换后将结果转换回 PIL 格式

7. 现在数据集已准备好使用您的机器学习框架进行训练!

在 GitHub 上更新

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