Datasets documentation

전처리

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

전처리

데이터셋 로딩 외에도, 🤗 Datasets의 또 다른 주요 목표는 머신러닝 프레임워크로 학습하기에 적합한 형식으로 데이터셋을 변환할 수 있도록 다양한 전처리 함수를 제공하는 것입니다.

데이터셋을 전처리하는 방법은 다양하며, 이는 모두 사용자의 특정 데이터셋에 따라 달라집니다. 때로는 컬럼 이름을 변경해야 하고, 다른 때는 중첩된 필드를 평탄화(unflatten)해야 할 수도 있습니다. 🤗 Datasets는 이러한 작업의 대부분을 수행할 수 있는 방법을 제공합니다. 하지만 데이터셋의 모달리티에 따라, 거의 모든 전처리 상황에서 다음이 필요합니다:

  • 텍스트 데이터셋을 토큰화합니다.
  • 오디오 데이터셋을 리샘플링합니다.
  • 이미지 데이터셋에 변환을 적용합니다.

마지막 전처리 단계는 일반적으로 데이터셋 형식을 머신러닝 프레임워크가 기대하는 입력 형식에 맞게 설정하는 것입니다.

이 튜토리얼에서는 🤗 Transformers 라이브러리도 설치해야 합니다:

pip install transformers

원하시는 데이터셋을 선택하고 따라 해 보세요!

텍스트를 토큰화

모델은 원시 텍스트를 처리할 수 없으므로 텍스트를 숫자로 변환해야 합니다. 토큰화(Tokenization)는 텍스트를 토큰이라 불리는 개별 단어로 나누는 방식으로 이를 수행합니다. 토큰은 최종적으로 숫자로 변환됩니다.

토큰화 및 다양한 토큰화 알고리즘에 대해 자세히 알아보려면 Hugging Face 강의 2장의 Tokenizers 섹션을 확인하세요.

1. rotten_tomatoes 데이터셋과 사전 학습된 BERT 모델에 해당하는 토크나이저를 로드하는 것으로 시작합니다. 텍스트가 동일한 방식으로 분할되도록 확인해야 하므로 사전 학습 모델과 동일한 토크나이저를 사용하는 것이 중요합니다.

>>> from transformers import AutoTokenizer
>>> from datasets import load_dataset

>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")

2. 데이터셋의 text 첫 번째 행에 대해 토크나이저를 호출합니다:

>>> tokenizer(dataset[0]["text"])
{'input_ids': [101, 1103, 2067, 1110, 17348, 1106, 1129, 1103, 6880, 1432, 112, 188, 1207, 107, 14255, 1389, 107, 1105, 1115, 1119, 112, 188, 1280, 1106, 1294, 170, 24194, 1256, 3407, 1190, 170, 11791, 5253, 188, 1732, 7200, 10947, 12606, 2895, 117, 179, 7766, 118, 172, 15554, 1181, 3498, 6961, 3263, 1137, 188, 1566, 7912, 14516, 6997, 119, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

토크나이저는 세 가지 항목이 포함된 사전(dict)을 반환합니다:

  • input_ids: 텍스트의 토큰을 나타내는 숫자.
  • token_type_ids: 두 개 이상의 시퀀스가 있는 경우 토큰이 속한 시퀀스를 나타냅니다.
  • attention_mask: 토큰이 마스킹되어야 하는지 여부를 나타냅니다.

이 값들은 실제로 모델 입력입니다.

3. 전체 데이터셋을 가장 빠르게 토큰화하는 방법은 map() 함수를 사용하는 것입니다. 이 함수는 개별 예시 대신 배치 단위의 예시에 토크나이저를 적용하여 토큰화 속도를 높입니다. batched 매개변수를 True로 설정하세요:

>>> def tokenization(example):
...     return tokenizer(example["text"])

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

4. 데이터셋의 형식을 머신러닝 프레임워크와 호환되도록 설정합니다:

Pytorch
Hide Pytorch content

PyTorch와 호환되도록 데이터셋 형식을 설정하려면 set_format() 함수를 사용하세요:

>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"])
>>> dataset.format['type']
'torch'
TensorFlow
Hide TensorFlow content

to_tf_dataset() 함수를 사용하여 데이터셋 형식을 TensorFlow와 호환되도록 설정합니다. 또한, 다양한 길이의 시퀀스를 동일한 길이의 단일 배치로 결합하기 위해 🤗 Transformers에서 data collator를 가져와야 합니다:

>>> from transformers import DataCollatorWithPadding

>>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf")
>>> tf_dataset = dataset.to_tf_dataset(
...     columns=["input_ids", "token_type_ids", "attention_mask"],
...     label_cols=["label"],
...     batch_size=2,
...     collate_fn=data_collator,
...     shuffle=True
... )

5. 이제 데이터셋은 머신러닝 프레임워크로 학습할 준비가 되었습니다!

오디오 신호 리샘플링

텍스트 데이터셋과 같은 오디오 입력은 이산적인 데이터 포인트로 나뉘어야 합니다. 이를 샘플링이라고 하며, 샘플링 레이트는 초당 얼마나 많은 음성 신호가 캡처되는지를 나타냅니다. 사용하는 모델의 사전 학습에 사용된 데이터의 샘플링 레이트와 데이터셋의 샘플링 레이트가 일치하는지 확인하는 것이 중요합니다. 샘플링 레이트가 다르면, 사전 학습된 모델이 샘플링 레이트의 차이를 인식하지 못해 데이터셋에서 성능이 저하될 수 있습니다.

1. MInDS-14 데이터셋, Audio 기능, 사전 학습된 Wav2Vec2 모델에 해당하는 feature extractor를 로드하는 것으로 시작합니다:

>>> 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")

2. 데이터셋의 첫 번째 행에 인덱싱합니다. 데이터셋의 audio 컬럼을 호출하면 자동으로 디코딩 및 리샘플링됩니다:

>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_rate
8000

3. 데이터셋 카드를 읽는 것은 매우 유용하며 데이터셋에 대한 많은 정보를 얻을 수 있습니다. MInDS-14 데이터셋 카드를 간단히 살펴보면 샘플링 레이트가 8kHz임을 알 수 있습니다. 마찬가지로, 모델 카드에서 모델에 대한 많은 세부 정보를 얻을 수 있습니다. Wav2Vec2 모델 카드에는 16kHz 음성 오디오로 샘플링되었음이 명시되어 있습니다. 이는 모델의 샘플링 레이트에 맞추기 위해 MInDS-14 데이터셋을 업샘플링해야 함을 의미합니다.

cast_column() 함수를 사용하고 Audio 기능의 sampling_rate 매개변수를 설정하여 오디오 신호를 업샘플링합니다. 이제 audio 컬럼을 호출하면 16kHz로 디코딩 및 리샘플링됩니다:

>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16_000))
>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_rate
16000

4. map() 함수를 사용하여 전체 데이터셋을 16kHz로 리샘플링합니다. 이 함수는 개별 예시 대신 배치 단위의 예시에 피처 추출기를 적용하여 리샘플링 속도를 높입니다. batched 매개변수를 True로 설정합니다:

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

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

5. 이제 데이터셋은 머신러닝 프레임워크로 학습할 준비가 되었습니다!

데이터 증강 적용

이미지 데이터셋에서 가장 일반적으로 수행하는 전처리는 데이터 증강(data augmentation)입니다. 이는 데이터의 의미를 변경하지 않으면서 이미지에 무작위 변형을 도입하는 과정입니다. 예를 들어, 이미지의 색상 특성을 변경하거나 이미지를 무작위로 잘라내는 작업이 해당됩니다. 원하는 데이터 증강 라이브러리를 자유롭게 사용할 수 있으며, 🤗 Datasets는 데이터셋에 데이터 증강을 적용하는 데 도움을 줍니다.

1. Beans 데이터셋, Image 기능, 사전 학습된 ViT 모델에 해당하는 feature extractor를 로드하는 것으로 시작합니다:

>>> from transformers import AutoImageProcessor
>>> from datasets import load_dataset, Image

>>> image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224-in21k")
>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train")

2. 데이터셋의 첫 번째 행에 인덱싱합니다. 데이터셋의 image 컬럼을 호출하면 내부의 PIL 객체가 자동으로 이미지로 디코딩됩니다.

>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x7FE5A047CC70>

대부분의 이미지 모델은 이미지가 RGB 모드인 것을 기대합니다. Beans 이미지는 이미 RGB 모드이지만, 데이터셋에 다른 모드의 이미지가 포함된 경우 cast_column() 함수를 사용하여 모드를 RGB로 설정할 수 있습니다:

>>> dataset = dataset.cast_column("image", Image(mode="RGB"))

3. 이제 이미지 데이터에 데이터 증강을 적용해 보겠습니다. 🤗 Datasets는 어떤 증강 라이브러리든 사용할 수 있으며, 이 예시에서는 Albumentations를 사용합니다.

Albumentations는 공간 수준 변환, 픽셀 수준 변환, 혼합 수준 변환을 포함한 풍부한 변환 세트를 제공하는 인기 있는 이미지 증강 라이브러리입니다.

Albumentations 설치:

pip install albumentations

4. Albumentations로 일반적인 증강 파이프라인을 생성합니다:

>>> import albumentations as A
>>> import numpy as np
>>> from PIL import Image

>>> transform = A.Compose([
...     A.RandomCrop(height=256, width=256, pad_if_needed=True, p=1),
...     A.HorizontalFlip(p=0.5),
...     A.ColorJitter(p=0.5)
... ])

5. 🤗 Datasets는 PIL 이미지를 사용하지만 Albumentations는 NumPy 배열을 기대하므로, 포맷 간 변환이 필요합니다:

>>> def albumentations_transforms(examples):
...     # Apply Albumentations transforms
...     transformed_images = []
...     for image in examples["image"]:
...         # Convert PIL to numpy array (OpenCV format)
...         image_np = np.array(image.convert("RGB"))
...         
...         # Apply Albumentations transforms
...         transformed_image = transform(image=image_np)["image"]
...         
...         # Convert back to PIL Image
...         pil_image = Image.fromarray(transformed_image)
...         transformed_images.append(pil_image)
...     
...     examples["pixel_values"] = transformed_images
...     return examples

6. with_transform()를 사용하여 변환을 적용합니다:

>>> dataset = dataset.with_transform(albumentations_transforms)
>>> dataset[0]["pixel_values"]

🤗 Datasets와 함께 Albumentations를 사용할 때의 주요 사항:

  • 변환을 적용하기 전에 PIL 이미지를 NumPy 배열로 변환
  • Albumentations는 변환된 이미지를 "image" 키 아래에 포함하는 딕셔너리를 반환합니다
  • 변환 후 결과를 PIL 형식으로 다시 변환

7. 이제 데이터셋은 머신러닝 프레임워크로 학습할 준비가 되었습니다!

Update on GitHub