๐Ÿค— Datasets ๋น ๋ฅธ ์‹œ์ž‘

๐Ÿค— Datasets ๋น ๋ฅธ ์‹œ์ž‘ (Quickstart)

์ด ํ€ต์Šคํƒ€ํŠธ๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ๋งŒ์ ธ๋ณด๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ฐ€์ด๋“œ์˜ˆ์š”. ๋ชจ๋ธ ํ›ˆ๋ จ ์›Œํฌํ”Œ๋กœ์— ๐Ÿค— Datasets์„ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉํ•˜๋Š”์ง€ ์˜ˆ์‹œ๋กœ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ๋ถ„์ด๋ผ๋ฉด ํŠœํ† ๋ฆฌ์–ผ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฑธ ์ถ”์ฒœํ•ด์š”. ๋” ์ฐจ๊ทผ์ฐจ๊ทผ ์†Œ๊ฐœํ•ด ์ฃผ๊ฑฐ๋“ ์š”.

๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์‰ฌ์šด ์‹œ์ž‘ ๋ฐฉ๋ฒ•์€ Hugging Face Hub์— ์žˆ๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ์…‹์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฑฐ์˜ˆ์š”. ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ์…‹์ด ๋‹ค์–‘ํ•œ ํƒœ์Šคํฌ์— ๊ฑธ์ณ ์ค€๋น„๋˜์–ด ์žˆ์œผ๋‹ˆ๊นŒ, ์ž‘์—…ํ•˜๊ณ  ์‹ถ์€ ์œ ํ˜•์„ ๊ณ ๋ฅด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • Audio: ์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ์…‹์„ ๋ฆฌ์ƒ˜ํ”Œ๋งํ•ด์„œ ๋ชจ๋ธ์ด ์€ํ–‰ ์—…๋ฌด ์œ ํ˜•์„ ๋ถ„๋ฅ˜ํ•˜๋„๋ก ์ค€๋น„
  • Vision: ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹์— ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•(augmentation)์„ ์ ์šฉํ•ด์„œ ๋ณ‘ ์ง„๋‹จ ๋ชจ๋ธ ์ค€๋น„
  • NLP: ๋ฐ์ดํ„ฐ์…‹์„ ํ† ํฐํ™”ํ•ด์„œ ๋‘ ๋ฌธ์žฅ์˜ ์˜๋ฏธ๊ฐ€ ๊ฐ™์€์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ชจ๋ธ ์ค€๋น„

๋จผ์ € ๐Ÿค— Datasets์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

pip install datasets
  • ์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค๋ฃจ๋ ค๋ฉด Audio ๊ธฐ๋Šฅ์„ ์„ค์น˜ํ•ด์š”:
    pip install datasets[audio]
    
  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค๋ฃจ๋ ค๋ฉด Image ๊ธฐ๋Šฅ์„ ์„ค์น˜ํ•˜๋ฉด ๋ผ์š”:
    pip install datasets[vision]
    

Audio

์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ์…‹์€ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹๊ณผ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์š”. ๋‹ค๋งŒ ์ „์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ ์กฐ๊ธˆ ๋‹ฌ๋ผ์š”. ํ† ํฌ๋‚˜์ด์ € ๋Œ€์‹  feature extractor๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋“ ์š”.

์˜ค๋””์˜ค ์ž…๋ ฅ์€ ๋ชจ๋ธ์— ๋งž๊ฒŒ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ(sampling rate)๋ฅผ ๋ฆฌ์ƒ˜ํ”Œ๋งํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”. ์ด ํ€ต์Šคํƒ€ํŠธ์—์„œ๋Š” MInDS-14 ๋ฐ์ดํ„ฐ์…‹์„ ์ค€๋น„ํ•ด์„œ, ๊ณ ๊ฐ์ด ๊ฒช๋Š” ์€ํ–‰ ์—…๋ฌด ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•ด ๋ณผ๊ฒŒ์š”.

1. load_dataset() ํ•จ์ˆ˜์— ๋ฐ์ดํ„ฐ์…‹ ์ด๋ฆ„, ๋ฐ์ดํ„ฐ์…‹ ์„ค์ •(configuration, ๋ชจ๋“  ๋ฐ์ดํ„ฐ์…‹์— ์žˆ๋Š” ๊ฑด ์•„๋‹˜), ๋ฐ์ดํ„ฐ์…‹ ๋ถ„ํ• (split)์„ ๋„˜๊ฒจ MInDS-14๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

>>> from datasets import load_dataset, Audio

>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train")

2. ๋‹ค์Œ์œผ๋กœ ๐Ÿค— Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์ „ํ›ˆ๋ จ๋œ Wav2Vec2 ๋ชจ๋ธ๊ณผ ๊ทธ์— ๋งž๋Š” feature extractor๋ฅผ ๋ถˆ๋Ÿฌ์™€์š”. ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์˜จ ๋’ค ์ผ๋ถ€ ๊ฐ€์ค‘์น˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฑด ์ •์ƒ์ด์—์š”.

>>> from transformers import AutoModelForAudioClassification, AutoFeatureExtractor

>>> model = AutoModelForAudioClassification.from_pretrained("facebook/wav2vec2-base")
>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")

3. ๋ชจ๋ธ์˜ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ์— ๋งž์ถ”๋ ค๋ฉด cast_column() ํ•จ์ˆ˜์™€ Audio feature๋กœ audio ์ปฌ๋Ÿผ์„ ์—…์ƒ˜ํ”Œ๋งํ•ด์•ผ ํ•ด์š”.

>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))
>>> dataset[0]["audio"]

4. feature extractor๋กœ ์˜ค๋””์˜ค array๋ฅผ ์ „์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ์‹œํ€€์Šค๋ฅผ ์ž˜๋ผ๋‚ด๊ณ (truncate) ํŒจ๋”ฉํ•ด์„œ ๊น”๋”ํ•œ ์ง์‚ฌ๊ฐํ˜• ํ…์„œ๋กœ ๋งŒ๋“ค์–ด์š”. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ feature extractor์— ์˜ค๋””์˜ค array๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฑฐ์˜ˆ์š”. array โ€” ์‹ค์ œ ์Œ์„ฑ ์‹ ํ˜ธ โ€” ๊ฐ€ ๋ชจ๋ธ ์ž…๋ ฅ์ด ๋˜๊ฑฐ๋“ ์š”.

์ „์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด map() ํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ์ดํ„ฐ์…‹์˜ ์˜ˆ์‹œ ๋ฐฐ์น˜(batch)์— ์ ์šฉํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

>>> def preprocess_function(examples):
...     audio_arrays = [x.get_all_samples().data for x in examples["audio"]]
...     inputs = feature_extractor(
...         audio_arrays,
...         sampling_rate=16000,
...         padding=True,
...         max_length=100000,
...         truncation=True,
...     )
...     return inputs

>>> dataset = dataset.map(preprocess_function, batched=True)

5. rename_column() ํ•จ์ˆ˜๋กœ intent_class ์ปฌ๋Ÿผ์„ labels๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์š”. labels๋Š” ๋ชจ๋ธ์ด ๊ธฐ๋Œ€ํ•˜๋Š” ์ž…๋ ฅ ์ด๋ฆ„์ด๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.

set_format() ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ์…‹ ํฌ๋งท์„ torch๋กœ ์„ค์ •ํ•˜๊ณ , ํฌ๋งทํ•  ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•ด์š”. ์ด ํ•จ์ˆ˜๋Š” ํฌ๋งท์„ ์ฆ‰์‹œ(on-the-fly) ์ ์šฉํ•ด์š”.

PyTorch ํ…์„œ๋กœ ๋ฐ”๊พผ ๋’ค์—๋Š” ๋ฐ์ดํ„ฐ์…‹์„ torch.utils.data.DataLoader๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.

>>> from torch.utils.data import DataLoader

>>> dataset.set_format(type="torch", columns=["input_values", "labels"])
>>> dataloader = DataLoader(dataset, batch_size=4)

TensorFlow๋ฅผ ์“ด๋‹ค๋ฉด ๐Ÿค— Transformers์˜ prepare_tf_dataset ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์š”. ์ด ๋ฉ”์„œ๋“œ๋Š” HuggingFace Dataset์„ tf.data.Dataset๋กœ ๊ฐ์‹ธ์„œ ๋ชจ๋ธ ํ›ˆ๋ จ/๋ฏธ์„ธ์กฐ์ •์— ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ์ค€๋น„ํ•ด ์ค˜์š”.

>>> import tensorflow as tf

>>> tf_dataset = model.prepare_tf_dataset(
...     dataset,
...     batch_size=4,
...     shuffle=True,
... )

Vision

์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹๋„ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹์ฒ˜๋Ÿผ ๋ถˆ๋Ÿฌ์™€์š”. ๋‹ค๋งŒ ํ† ํฌ๋‚˜์ด์ € ๋Œ€์‹  feature extractor๋กœ ๋ฐ์ดํ„ฐ์…‹์„ ์ „์ฒ˜๋ฆฌํ•ด์•ผ ํ•ด์š”.

์ด ํ€ต์Šคํƒ€ํŠธ์—์„œ๋Š” Beans ๋ฐ์ดํ„ฐ์…‹์„ ๋ถˆ๋Ÿฌ์™€์„œ ์žŽ์‚ฌ๊ท€ ์ด๋ฏธ์ง€๋กœ ์งˆ๋ณ‘์„ ํŒ๋ณ„ํ•˜๋Š” ๋ชจ๋ธ์„ ํ›ˆ๋ จ์‹œ์ผœ ๋ณผ๊ฒŒ์š”.

1. load_dataset() ํ•จ์ˆ˜์— ๋ฐ์ดํ„ฐ์…‹ ์ด๋ฆ„๊ณผ ๋ฐ์ดํ„ฐ์…‹ ๋ถ„ํ• ์„ ๋„˜๊ฒจ Beans ๋ฐ์ดํ„ฐ์…‹์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

>>> from datasets import load_dataset, Image

>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train")

2. ๐Ÿค— Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์ „ํ›ˆ๋ จ๋œ ViT ๋ชจ๋ธ๊ณผ ๊ทธ์— ๋งž๋Š” feature extractor๋ฅผ ๋ถˆ๋Ÿฌ์™€์š”.

>>> from transformers import AutoModelForImageClassification, AutoFeatureExtractor

>>> model = AutoModelForImageClassification.from_pretrained("google/vit-base-patch16-224-in21k")
>>> feature_extractor = AutoFeatureExtractor.from_pretrained("google/vit-base-patch16-224-in21k")

3. ์ด๋ฏธ์ง€๋ฅผ ํ…์„œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ „์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“  ๋’ค map() ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ์…‹์˜ ๋ฐฐ์น˜์— ์ ์šฉํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•ด์š”.

>>> def transforms(examples):
...     examples["pixel_values"] = [feature_extractor(image, return_tensors="pt")["pixel_values"][0] for image in examples["image"]]
...     return examples

>>> dataset = dataset.map(transforms, batched=True)

4. rename_column() ํ•จ์ˆ˜๋กœ labels ์ปฌ๋Ÿผ์„ label๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์š”.

with_format() ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ์…‹ ํฌ๋งท์„ torch๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

>>> import torch

>>> dataset = dataset.rename_column("labels", "label")
>>> dataset = dataset.with_format(type="torch", columns=["pixel_values", "label"])
>>> dataloader = torch.utils.data.DataLoader(dataset, batch_size=4)

TensorFlow์šฉ์œผ๋กœ๋Š” prepare_tf_dataset ๋ฉ”์„œ๋“œ๋กœ tf.data.Dataset์„ ์ค€๋น„ํ•ด์š”.

>>> import tensorflow as tf

>>> tf_dataset = model.prepare_tf_dataset(
...     dataset,
...     batch_size=4,
...     shuffle=True,
... )

NLP

ํ…์ŠคํŠธ๋Š” tokenizer๋กœ ๊ฐœ๋ณ„ ํ† ํฐ์œผ๋กœ ๋ถ„์ ˆํ•ด์•ผ ํ•ด์š”.

์ด ํ€ต์Šคํƒ€ํŠธ์—์„œ๋Š” Microsoft Research Paraphrase Corpus (MRPC) ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์…‹์„ ๋ถˆ๋Ÿฌ์™€์„œ ๋‘ ๋ฌธ์žฅ์˜ ์˜๋ฏธ๊ฐ€ ๊ฐ™์€์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ชจ๋ธ์„ ํ›ˆ๋ จ์‹œํ‚ฌ ๊ฑฐ์˜ˆ์š”.

1. load_dataset() ํ•จ์ˆ˜์— ๋ฐ์ดํ„ฐ์…‹ ์ด๋ฆ„, ๋ฐ์ดํ„ฐ์…‹ ์„ค์ •, ๋ฐ์ดํ„ฐ์…‹ ๋ถ„ํ• ์„ ๋„˜๊ฒจ MRPC ๋ฐ์ดํ„ฐ์…‹์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

>>> from datasets import load_dataset

>>> dataset = load_dataset("nyu-mll/glue", "mrpc", split="train")

2. ๐Ÿค— Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์ „ํ›ˆ๋ จ๋œ BERT ๋ชจ๋ธ๊ณผ ๊ทธ์— ๋งž๋Š” ํ† ํฌ๋‚˜์ด์ €๋ฅผ ๋ถˆ๋Ÿฌ์™€์š”. ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์˜จ ๋’ค ์ผ๋ถ€ ๊ฐ€์ค‘์น˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฑด ์ •์ƒ์ด์—์š”.

>>> from transformers import AutoModelForSequenceClassification, AutoTokenizer

>>> model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

TensorFlow๋ฅผ ์“ด๋‹ค๋ฉด:

>>> from transformers import TFAutoModelForSequenceClassification, AutoTokenizer

>>> model = TFAutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

3. ๋ฐ์ดํ„ฐ์…‹์„ ํ† ํฐํ™”ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ํ…์ŠคํŠธ๋ฅผ ์ž˜๋ผ๋‚ด๊ณ  ํŒจ๋”ฉํ•ด์„œ ๊น”๋”ํ•œ ์ง์‚ฌ๊ฐํ˜• ํ…์„œ๋กœ ๋งŒ๋“ค์–ด์š”. ํ† ํฌ๋‚˜์ด์ €๋Š” ๋ฐ์ดํ„ฐ์…‹์— input_ids, token_type_ids, attention_mask๋ผ๋Š” ์„ธ ๊ฐœ์˜ ์ƒˆ ์ปฌ๋Ÿผ์„ ์ƒ์„ฑํ•ด์š”. ์ด๋“ค์ด ๋ชจ๋ธ ์ž…๋ ฅ์ด์—์š”.

map() ํ•จ์ˆ˜๋กœ ํ† ํฐํ™” ํ•จ์ˆ˜๋ฅผ ๋ฐ์ดํ„ฐ์…‹์˜ ๋ฐฐ์น˜์— ์ ์šฉํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•ด์š”.

>>> def encode(examples):
...     return tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, padding="max_length")

>>> dataset = dataset.map(encode, batched=True)
>>> dataset[0]
{'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .',
 ...

4. label ์ปฌ๋Ÿผ์„ labels๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์š”. labels๋Š” BertForSequenceClassification์ด ๊ธฐ๋Œ€ํ•˜๋Š” ์ž…๋ ฅ ์ด๋ฆ„์ด์—์š”.

>>> dataset = dataset.map(lambda examples: {"labels": examples["label"]}, batched=True)

with_format() ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ์…‹ ํฌ๋งท์„ torch๋กœ ์„ค์ •ํ•˜๊ณ , ํฌ๋งทํ•  ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•ด์š”.

PyTorch ํ…์„œ๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค์—๋Š” ๋ฐ์ดํ„ฐ์…‹์„ torch.utils.data.DataLoader๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.

>>> import torch

>>> dataset = dataset.select_columns(["input_ids", "token_type_ids", "attention_mask", "labels"])
>>> dataset = dataset.with_format(type="torch")
>>> dataloader = torch.utils.data.DataLoader(dataset, batch_size=32)

TensorFlow์šฉ์œผ๋กœ๋Š” prepare_tf_dataset ๋ฉ”์„œ๋“œ๋กœ tf.data.Dataset์„ ์ค€๋น„ํ•ด์š”.

>>> import tensorflow as tf

>>> tf_dataset = model.prepare_tf_dataset(
...     dataset,
...     batch_size=4,
...     shuffle=True,
... )

๋‹ค์Œ์€ ๋ฌด์—‡์„?

์—ฌ๊ธฐ๊นŒ์ง€ ๐Ÿค— Datasets ํ€ต์Šคํƒ€ํŠธ๋ฅผ ๋งˆ์ณค์–ด์š”. ์ด์ œ ๋‹จ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ํ…์ŠคํŠธยท์˜ค๋””์˜คยท์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ๋ชจ๋ธ์ด ํ›ˆ๋ จํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ถœ์ฒ˜: ๊ณต์‹๋ฌธ์„œ