前回
今回はデータセットの事前処理の仕方を学ぶ
lerobotのデータセットではやりづらい部分があったので,今回は公式のチュートリアル通りに進める
Install
- pytorch: 自身のバージョンを確認してインストール
- その他
pip install SoundFile librosa
Tokenize Text
学習する際には,テキストを数値で扱うため,テキストデータを数値化(tokenize
)する必要がある
TokenizerとDatasetをダウンロードする
>>> from transformers import AutoTokenizer
>>> from datasets import load_dataset
>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
>>> dataset = load_dataset("rotten_tomatoes", split="train")
データを埋め込むにはtokenizer
を使う
>>> tokenizer(dataset[0]["text"])
{'input_ids': [101, 1996, 2600, 2003, 16036, 2000, 2022, 1996, 7398, 2301, 1005, 1055, 2047, 1000, 16608, 1000, 1998, 2008, 2002, 1005, 1055, 2183, 2000, 2191, 1037, 17624, 2130, 3618, 2084, 7779, 29058, 8625, 13327, 1010, 3744, 1011, 18856, 19513, 3158, 5477, 4168, 2030, 7112, 16562, 2140, 1012, 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], '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]}
map
関数を使うと,データセット全体を埋め込むことができる.
>>> def tokenization(example):
... return tokenizer(example["text"])
...
>>> dataset = dataset.map(tokenization, batched=True)
map
関数のイメージを掴みたい方はこちら: https://note.nkmk.me/python-map-usage/
自身の使っているフレームワーク用にデータの型を変更する
今回はPytorchのtensorに変更
>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"])
>>> dataset.format["type"]
'torch'
これでテキストデータの事前処理は完了
Resampling Audio
音声データの場合は,モデルとデータセットでサンプルレートが異なるとうまく学習できない.そのため,サンプルレートを合わせるための事前処理が必要
>>> 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")
>>> dataset[0]["audio"]
{'path': '/root/.cache/huggingface/datasets/downloads/extracted/216420dd3c250f9c0f60b0418eb61d836fffda51ef660ee4c0e852c1339424bc/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav', 'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414,
0. , 0. ]), 'sampling_rate': 8000}
model cardやdataset cardを読むと色々なことがわかるので,活用する前にきちんと理解すると良い
Wav2Vec2モデルはサンプルレートが16kHz,データセットは8kHzなので,データセット側をupsamplingする必要がある
cast_column
を使う
>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16_000))
>>> dataset[0]["audio"]
{'path': '/root/.cache/huggingface/datasets/downloads/extracted/216420dd3c250f9c0f60b0418eb61d836fffda51ef660ee4c0e852c1339424bc/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav', 'array': array([ 1.70562416e-05, 2.18727451e-04, 2.28099874e-04, ...,
3.43842403e-05, -5.96364771e-06, -1.76846661e-05]), 'sampling_rate': 16000}
map
関数を使ってデータセット全体にupsamplingを適用する
>>> 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)
これで学習可能な音声データが完成.
Apply Data Augmentations
すでにあるデータを事前処理で拡張できる.特に画像データなどを扱う際に有効
>>> feature_extractor = AutoFeatureExtractor.from_pretrained("google/vit-base-patch16-224-in21k")
>>> dataset = load_dataset("beans", split="train")
>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x72FE47FF5360>
例えば回転させる
>>> from torchvision.transforms import RandomRotation
>>> rotate = RandomRotation(degrees=(0, 90))
>>> def transforms(examples):
... examples["pixel_values"] = [rotate(image) for image in examples["image"]] # ここで新しいkeyをさくせいしている
... return examples
...
>>> dataset.set_transform(transforms)
>>> dataset[0]["pixel_values"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x72FE69CCAAD0>
Link
目次