Datasets 文件
預處理
並獲得增強的文件體驗
開始使用
預處理
除了載入資料集,🤗 Datasets 的另一個主要目標是提供多樣化的預處理函式,以使資料集轉換為適合你的機器學習框架訓練的格式。
預處理資料集有許多可能的方式,這完全取決於你特定的資料集。有時你可能需要重新命名列,有時你可能需要展平巢狀欄位。🤗 Datasets 提供了實現這些大部分功能的方法。但在幾乎所有的預處理情況下,根據你的資料集模式,你需要:
- 對文字資料集進行標記。
- 對音訊資料集進行重取樣。
- 對影像資料集應用變換。
最後的預處理步驟通常是將資料集格式設定為與你的機器學習框架預期的輸入格式相容。
在本教程中,你還需要安裝 🤗 Transformers 庫
pip install transformers
選擇你喜歡的資料集,跟著做吧!
文字標記化
模型無法處理原始文字,因此你需要將文字轉換為數字。標記化提供了一種透過將文字分割成稱為*tokens*的單個單詞來實現此目的的方法。Tokens 最終會被轉換為數字。
檢視 Hugging Face 課程第二章的 標記器 部分,瞭解更多關於標記化和不同標記化演算法的資訊。
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
:表示文字中標記的數字。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
列時,它會自動解碼和重取樣。
>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_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))
>>> 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. 資料集現在已準備好與你的機器學習框架進行訓練!
應用資料增強
對影像資料集最常見的預處理是*資料增強*,這是一個在不改變資料含義的情況下對影像引入隨機變化的過程。這可能意味著改變影像的顏色屬性或隨機裁剪影像。你可以自由使用任何你喜歡的資料增強庫,而 🤗 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 上更新