0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第3回 Preprocess

Last updated at Posted at 2025-01-05

前回

今回はデータセットの事前処理の仕方を学ぶ

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

目次

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?