資料集文件
預處理
並獲得增強的文件體驗
開始使用
預處理
除了載入資料集之外,🤗 Datasets 的另一個主要目標是提供多樣化的預處理函數,以便將資料集轉換為適合您機器學習框架訓練的格式。
預處理資料集的方法有很多種,具體取決於您的資料集。有時您可能需要重新命名欄位,有時則可能需要展開巢狀欄位。🤗 Datasets 提供了處理這些需求的方法。但在幾乎所有的預處理情況中,根據您的資料集型態,您都需要執行以下操作:
- 對文字資料集進行 Tokenize (分詞)。
- 對音訊資料集進行重新採樣 (Resample)。
- 對圖像資料集應用轉換 (Transform)。
最後一個預處理步驟通常是設定您的資料集格式,使其與機器學習框架預期的輸入格式相容。
在本教學中,您還需要安裝 🤗 Transformers 函式庫。
pip install transformers
選擇一個資料集並跟著操作吧!
文字分詞 (Tokenize)
模型無法處理原始文字,因此您需要將文字轉換為數字。Tokenization 透過將文字切分為單獨的字詞(稱為 tokens)來實現這一點。Token 最終會被轉換為數字。
請查閱 Hugging Face 課程第 2 章的 Tokenizers 章節,以深入了解 Tokenization 和不同的分詞演算法。
1. 首先載入 rotten_tomatoes 資料集,以及與預訓練 BERT 模型對應的 Tokenizer。使用與預訓練模型相同的 Tokenizer 非常重要,因為您必須確保文字的切割方式是一致的。
>>> 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。
>>> 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]}Tokenizer 會回傳一個包含三項內容的字典:
input_ids:代表文字中 Token 的數字。token_type_ids:如果有多個序列,則指示 Token 屬於哪個序列。attention_mask:指示 Token 是否應該被遮蔽 (Masked)。
這些數值實際上就是模型的輸入。
3. 對整個資料集進行 Tokenize 最快的方法是使用 map() 函數。此函數透過對批次 (batch) 的範例而不是單個範例應用 Tokenizer 來加速分詞。請將 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 匯入一個 資料整理器 (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. 資料集現在已準備好,可以使用您的機器學習框架進行訓練了!
音訊訊號重新採樣 (Resample)
與文字資料集一樣,音訊輸入也需要被劃分為離散的資料點。這稱為採樣 (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
80003. 閱讀資料集卡片 (dataset card) 非常有用,可以提供大量關於該資料集的資訊。快速瀏覽 MInDS-14 資料集卡片可知其採樣率為 8kHz。同樣地,您可以從模型卡片中獲得關於模型的許多細節。Wav2Vec2 模型卡片指出它是在 16kHz 的語音音訊上進行採樣的。這意味著您需要將 MInDS-14 資料集進行上採樣 (upsample),以符合模型的採樣率。
使用 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
160004. 使用 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 建立一個典型的增強流程 (pipeline)。
>>> 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 examples6. 使用 with_transform() 應用轉換。
>>> dataset = dataset.with_transform(albumentations_transforms)
>>> dataset[0]["pixel_values"]將 Albumentations 與 🤗 Datasets 配合使用時的重點:
- 在應用轉換前,請將 PIL 圖像轉換為 NumPy 陣列。
- Albumentations 會回傳一個字典,其中轉換後的圖像位於 "image" 鍵下。
- 轉換後,請將結果轉回 PIL 格式。
7. 資料集現在已準備好,可以使用您的機器學習框架進行訓練了!
在 GitHub 上更新