Datasets documentation
前処理
前処理
🤗 Datasetsの主な目的は、データセットの読み込みだけでなく、機械学習フレームワークでの学習に適した形式にデータセットを整形するための多様な前処理関数を提供することです。
データセットの前処理には多くの方法があり、すべては特定のデータセットに依存します。時にはカラムの名前を変更する必要があり、他の時にはネストされたフィールドをフラットにする必要があるかもしれません。🤗 Datasetsは、これらの大部分を行う方法を提供しています。しかし、前処理のほぼすべてのケースにおいて、データセットのモダリティに応じて、以下を行う必要があります:
- テキストデータセットをトークナイズします。
- オーディオデータセットをリサンプリングします。
- 画像データセットにトランスフォームを適用します。
最後の前処理ステップは、通常、データセットの形式を機械学習フレームワークが期待する入力形式と互換性のあるように設定することです。
このチュートリアルでは、🤗 Transformersライブラリのインストールも必要です:
pip install transformers
お好みのデータセットを取得して、一緒に進めてみましょう!
テキストのトークン化
モデルは生のテキストを処理できないため、テキストを数値に変換する必要があります。トークナイゼーションは、テキストをトークンと呼ばれる個々の単語に分割することで、この変換を実現する方法を提供します。最終的に、トークンは数値に変換されます。
トークナイゼーションと異なるトークナイゼーションアルゴリズムについて詳しく学ぶには、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]}tokenizerは、3つの項目を含む辞書を返します:
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 から 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秒あたりにどれだけ音声信号がキャプチャされるかを示します。使用しているモデルの事前学習に用いられたデータのサンプリングレートと、データセットのサンプリングレートが一致していることを確認することが重要です。サンプリングレートが異なる場合、事前学習済みモデルはサンプリングレートの違いを認識できないため、あなたのデータセットで性能が低下する可能性があります。
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. データセットカードを読むことは非常に有用であり、データセットに関する多くの情報を得ることができます。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
160004. map()関数を使用して、データセット全体を16kHzにリサンプリングします。この関数は、個々のサンプルではなくバッチ単位でフィーチャーエクストラクターを適用することで、リサンプリングを高速化します。batchedパラメータをTrueに設定します:
>>> def preprocess_function(examples):
... audio_arrays = [x.get_all_samples().data[0].numpy() for x in examples["audio"]]
... inputs = feature_extractor(
... audio_arrays, sampling_rate=feature_extractor.sampling_rate, max_length=16000, truncation=True, padding="max_length"
... )
... return inputs
>>> dataset = dataset.map(preprocess_function, batched=True)5. データセットは、機械学習フレームワークでのトレーニングに準備が整いました!
データ拡張を適用する
画像データセットで最も一般的な前処理は、データ拡張です。これは、データの意味を変えずに画像にランダムな変化を導入するプロセスです。具体的には、画像の色特性を変更したり、画像をランダムにクロップしたりすることなどが挙げられます。お好みのデータ拡張ライブラリを自由に使用でき、🤗 Datasets は、データセットにデータ拡張を適用するのを支援します。
1. まず、Beans データセット、Image 特徴、および事前学習済み ViT モデルに対応する特徴抽出器を読み込みます:
>>> from transformers import AutoImageProcessor
>>> from datasets import load_dataset, Image
>>> image_processor = AutoImageProcessor.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 examples6. with_transform()を使用して変換を適用します:
>>> dataset = dataset.with_transform(albumentations_transforms)
>>> dataset[0]["pixel_values"]🤗 DatasetsとAlbumentationsを併用する際の重要なポイント:
- 変換を適用する前に、PIL画像をNumPy配列に変換します
- Albumentations は、変換された画像を “image” キーの下に持つ辞書を返します
- 変換後、結果をPIL形式に戻します
7. データセットは、機械学習フレームワークでのトレーニングに準備が整いました!
Update on GitHub