预处理
除了加载数据集之外, 🤗 Datasets 的另一个主要目标是提供各种预处理功能,以将数据集转换为适合使用机器学习框架进行训练的格式。
预处理数据集有很多方法,具体取决于您的数据集。有时您可能需要重命名列,而有时您可能需要展开嵌套字段。 🤗 Datasets 提供了执行大多数这些操作的方法。但在几乎所有预处理情况下,您都需要根据您的数据集类型进行以下操作:
- 对文本数据集进行分词。
- 对音频数据集进行重采样。
- 对图像数据集应用转换。
最后一步通常是将数据集格式设置为与机器学习框架的预期输入格式兼容。
在本教程中,您还需要安装 🤗 Transformers 库
pip install transformers
选择一个数据集,并开始操作吧!
将文本标记化
模型无法处理原始文本,因此您需要将文本转换为数字。标记化提供了一种方法,通过将文本划分为称为*标记*的单个单词来实现。最后,标记被转换为数字。
查看 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("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
:表示文本中标记的数字。token_type_ids
:指示标记属于哪个序列,如果有多个序列。attention_mask
:指示是否应该屏蔽标记。
这些值实际上是模型的输入。
3. 对整个数据集进行标记化最快的方法是使用map() 函数。此函数通过将标记器应用于批次示例而不是单个示例来加快标记化速度。将 batched
参数设置为 True
>>> def tokenization(example):
... return tokenizer(example["text"])
>>> dataset = dataset.map(tokenization, batched=True)
4. 将数据集的格式设置为与您的机器学习框架兼容
使用set_format() 函数将数据集格式设置为与 PyTorch 兼容
>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"])
>>> dataset.format['type']
'torch'
使用to_tf_dataset() 函数将数据集格式设置为与 TensorFlow 兼容。您还需要从 🤗 Transformers 导入一个数据整理器 来将不同的序列长度组合成一个具有相同长度的批次
>>> 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("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 上更新