第3回　Preprocess

前回

https://qiita.com/kosei1515/items/5e786e3c39a8aae26d74

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

lerobotのデータセットではやりづらい部分があったので，今回は公式のチュートリアル通りに進める

# Install
- pytorch: 自身のバージョンを確認してインストール 

https://pytorch.org/get-started/locally/ 
- その他
```
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
目次

https://qiita.com/kosei1515/items/ce1a16279526fa296a57