第１回　Hugging Face Hubからデータセットをダウンロードする


# Setup

使用するデータセット　Lerobotという，Robot learning beginnerのためのツールで提供されているもの

https://huggingface.co/datasets/lerobot/pusht

condaで仮想環境を作成しpythonを起動
```
conda create -n hf_dataset python=3.10
conda activate hf_dataset
pip install datasets
python
```

# Load dataset info
試しに`DatasetInfo`をダウンロードしてみる
```
>>> from datasets import load_dataset_builder
>>> ds_builder = load_dataset_builder("lerobot/pusht")
Resolving data files: 100%|██████████████████| 206/206 [00:00<00:00, 394.01it/s]
Resolving data files: 100%|████████████████| 206/206 [00:00<00:00, 33082.92it/s
```
infoを確認　今回のデータセットにて`info`は明記されていないらしい

```
>>> ds_builder.info.description
''
>>> ds_builder.info.features
{'observation.state': Sequence(feature=Value(dtype='float32', id=None), length=2, id=None), 'action': Sequence(feature=Value(dtype='float32', id=None), length=2, id=None), 'episode_index': Value(dtype='int64', id=None), 'frame_index': Value(dtype='int64', id=None), 'timestamp': Value(dtype='float32', id=None), 'next.reward': Value(dtype='float32', id=None), 'next.done': Value(dtype='bool', id=None), 'next.success': Value(dtype='bool', id=None), 'index': Value(dtype='int64', id=None), 'task_index': Value(dtype='int64', id=None)}

```

次にデータセットを読み込んで見る
```
>>> from datasets import load_dataset
>>> dataset = load_dataset("lerobot/pusht", split="train")
Resolving data files: 100%|██████████████████| 206/206 [00:00<00:00, 356.97it/s]
Resolving data files: 100%|████████████████| 206/206 [00:00<00:00, 53833.43it/s]
```

# Split
hugging faceのデータセットには，`split`という概念がある．各データが，学習(`train`)用なのか，検証(`validation`)用なのか，テスト(`test`)用なのかで分類(`split`)されている．

データセットがどのようにsplitされているのかを取得してみる
```
>>> from datasets import get_dataset_split_names
>>> get_dataset_split_names("lerobot/pusht")
Resolving data files: 100%|████████████████| 206/206 [00:00<00:00, 17020.46it/s]
Resolving data files: 100%|████████████████| 206/206 [00:00<00:00, 34846.81it/s]
['train']
```

この`split`をベースにデータセットをダウンロードすることが可能　今回は`train`のみだが，`test`等もある場合は`split="test"`を指定してダウンロードすることができる
```
dataset = load_dataset("lerobot/pusht", split="train")
```
`train`のみをダウンロードした場合は`Dataset`クラスを取得する
```
>>> dataset
Dataset({
    features: ['observation.state', 'action', 'episode_index', 'frame_index', 'timestamp', 'next.reward', 'next.done', 'next.success', 'index', 'task_index'],
    num_rows: 25650
})
```

一方，すべての`split`をダウンロードした場合は，`Dataset`の`dict`である`DatasetDict`クラスを取得する
```
>>> dataset = load_dataset("lerobot/pusht")
Resolving data files: 100%|████████████████| 206/206 [00:00<00:00, 33516.69it/s]
Resolving data files: 100%|████████████████| 206/206 [00:00<00:00, 35335.62it/s]
>>> dataset
DatasetDict({
    train: Dataset({
        features: ['observation.state', 'action', 'episode_index', 'frame_index', 'timestamp', 'next.reward', 'next.done', 'next.success', 'index', 'task_index'],
        num_rows: 25650
    })
})
```

# Configuration
sub-datasetを含むデータセットの場合，追加の設定`configuration`を指定してダウンロードする必要がある．
例えば，音声を含むデータセットは言語等の設定がある場合がある
`configuration`は以下のように取得できる
```
>>> from datasets import get_dataset_config_names
>>> get_dataset_config_names("lerobot/pusht")
Resolving data files: 100%|███████████████| 206/206 [00:00<00:00, 713481.94it/s]
['default']
```

`configuration`を指定してダウンロードするときは，第２引数で指定する
```
>>> dataset = load_dataset("lerobot/pusht", "default", split="train")
Resolving data files: 100%|██████████████████| 206/206 [00:00<00:00, 477.46it/s]
Resolving data files: 100%|████████████████| 206/206 [00:00<00:00, 27016.03it/s]
```

# Remote code
いくつかのデータセットでは，データセット生成時に追加のスクリプトを実行する．一応マルウェア等はチェックしてくれているようだが，このスクリプトの安全性はきちんと調査するべき．スクリプトを実行しつつダウンロードする場合は，`trust_remote_code=True`の設定が必要

`lerobot`のデータでは必要なかったため，一例としてTutorialのcommandを添付
```
>>> from datasets import get_dataset_config_names, get_dataset_split_names, load_dataset

>>> c4 = load_dataset("c4", "en", split="train", trust_remote_code=True)
>>> get_dataset_config_names("c4", trust_remote_code=True)
['en', 'realnewslike', 'en.noblocklist', 'en.noclean']
>>> get_dataset_split_names("c4", "en", trust_remote_code=True)
['train', 'validation']
```

以上

# Link

目次

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