Datasets documentation

데이터셋 기능

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

데이터셋 기능

Features는 데이터셋의 내부 구조를 정의합니다. 이는 기본 직렬화 형식을 지정하는 데 사용됩니다. 그러나 더 흥미로운 점은 Features가 컬럼 이름과 유형부터 ClassLabel까지 모든 것에 대한 고급 정보를 포함한다는 것입니다. Features를 데이터셋의 뼈대라고 생각할 수 있습니다.

Features 형식은 간단합니다: dict[column_name, column_type]. 컬럼 이름과 컬럼 타입의 쌍으로 이루어진 사전입니다. 컬럼 타입은 보유 중인 데이터의 유형을 설명하는 다양한 옵션을 제공합니다.

GLUE 벤치마크의 MRPC 데이터셋 기능을 살펴보겠습니다:

>>> from datasets import load_dataset
>>> dataset = load_dataset('nyu-mll/glue', 'mrpc', split='train')
>>> dataset.features
{'idx': Value('int32'),
 'label': ClassLabel(names=['not_equivalent', 'equivalent']),
 'sentence1': Value('string'),
 'sentence2': Value('string'),
}

Value 기능은 🤗 Datasets에 다음을 알려 줍니다:

  • idx 데이터 유형은 int32입니다.
  • sentence1과 sentence2 데이터 유형은 string입니다.

🤗 Datasets는 bool, float32, binary 등 다양한 데이터 유형을 지원합니다.

지원되는 데이터 유형의 전체 목록은 Value를 참조하세요.

ClassLabel 기능은 🤗 Datasets에 label 컬럼에 두 개의 클래스가 포함되어 있음을 알려줍니다. 클래스는 not_equivalent와 equivalent로 라벨링됩니다. 라벨은 데이터셋에서 정수 형태로 저장됩니다. 라벨을 가져올 때, ClassLabel.int2str()와 ClassLabel.str2int()가 정수 값에서 라벨 이름으로, 그리고 그 반대로 변환을 수행합니다.

데이터 유형에 객체 목록이 포함된 경우 List 기능을 사용해야 합니다. SQuAD 데이터셋을 기억하시나요?

>>> from datasets import load_dataset
>>> dataset = load_dataset('rajpurkar/squad', split='train')
>>> dataset.features
{'id': Value('string'),
 'title': Value('string'),
 'context': Value('string'),
 'question': Value('string'),
 'answers': {'text': List(Value('string')),
  'answer_start': List(Value('int32'))}}

answers 필드는 features의 dict를 사용하여 구성되며, text와 answer_start라는 두 개의 하위 필드를 포함합니다. 각각은 string과 int32의 리스트입니다.

중첩된 하위 필드를 독립적인 열로 추출하는 방법을 배우려면 flatten 섹션을 참조하세요.

배열 기능 유형은 다양한 크기의 배열을 생성하는 데 유용합니다. Array2D를 사용하면 2차원 배열을, Array5D를 사용하면 5차원 배열까지 생성할 수 있습니다.

>>> features = Features({'a': Array2D(shape=(1, 3), dtype='int32')})

배열 타입은 배열의 첫 번째 차원이 동적일 수도 있습니다. 이는 문장처럼 가변 길이를 가진 시퀀스를 처리할 때, 입력을 균일한 형태로 패딩하거나 잘라내지 않아도 되므로 유용합니다.

>>> features = Features({'a': Array3D(shape=(None, 5, 2), dtype='int32')})

오디오 기능

오디오 데이터셋에는 Audio 타입의 컬럼이 있으며, 이 컬럼에는 세 가지 중요한 필드가 포함되어 있습니다:

  • array: 1차원 배열로 표현된 디코딩된 오디오 데이터.
  • path: 다운로드된 오디오 파일의 경로.
  • sampling_rate: 오디오 데이터의 샘플링 레이트.

오디오 데이터셋을 로드하고 오디오 컬럼을 호출하면 Audio 기능이 오디오 파일을 자동으로 디코딩하고 리샘플링합니다:

>>> from datasets import load_dataset, Audio

>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train")
>>> dataset[0]["audio"]
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>

dataset[0]["audio"]와 같이 행 인덱스를 먼저 사용하고 audio 열을 인덱싱하여 오디오 데이터셋에 접근하세요. 이렇게 하면 데이터셋의 모든 오디오 파일을 디코딩하고 리샘플링하는 것을 방지할 수 있습니다. 그렇지 않으면 데이터셋이 크면 느리고 시간이 많이 걸리는 과정이 될 수 있습니다.

decode=False를 사용하면 Audio 타입은 오디오 파일을 torchcodec AudioDecoder 객체로 디코딩하지 않고, 해당 오디오 파일의 경로 또는 바이트만 반환합니다.

>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train").cast_column("audio", Audio(decode=False))
>>> dataset[0]
{'audio': {'bytes': None,
  'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav'},
 'english_transcription': 'I would like to set up a joint account with my partner',
 'intent_class': 11,
 'lang_id': 4,
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
 'transcription': 'I would like to set up a joint account with my partner'}

이미지 기능

이미지 데이터셋에는 PIL.Image 객체를 바이트로 저장된 이미지에서 로드하는 Image 타입의 열이 있습니다:

이미지 데이터셋을 로드하고 이미지 컬럼을 호출하면 Image 기능이 이미지 파일을 자동으로 디코딩합니다:

>>> from datasets import load_dataset, Image

>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train")
>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x125506CF8>

dataset[0]["image"]와 같이 행 인덱스를 먼저 사용하고 image 열을 인덱싱하여 이미지 데이터셋에 접근하세요. 이렇게 하면 데이터셋의 모든 이미지 파일을 디코딩하는 것을 방지할 수 있습니다. 그렇지 않으면 데이터셋이 크면 느리고 시간이 많이 걸리는 과정이 될 수 있습니다.

decode=False를 사용하면 Image 타입은 이미지를 PIL.Image로 디코딩하지 않고 이미지 파일의 경로 또는 바이트만 제공합니다.

>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train").cast_column("image", Image(decode=False))
>>> dataset[0]["image"]
{'bytes': None,
 'path': '/Users/username/.cache/huggingface/datasets/downloads/extracted/772e7c1fba622cff102b85dd74bcce46e8168634df4eaade7bedd3b8d91d3cd7/train/healthy/healthy_train.265.jpg'}

데이터셋에 따라 로컬로 다운로드된 이미지의 경로를 반환하거나, 데이터셋이 개별 파일로 구성되어 있지 않은 경우 이미지의 내용을 바이트로 반환할 수 있습니다.

numpy 배열에서 이미지 데이터셋을 정의할 수도 있습니다:

>>> ds = Dataset.from_dict({"i": [np.zeros(shape=(16, 16, 3), dtype=np.uint8)]}, features=Features({"i": Image()}))

이 경우 numpy 배열은 PNG로 인코딩됩니다(픽셀 값의 정밀도가 중요한 경우 TIFF).

RGB 또는 RGBA와 같은 다채널 배열의 경우 uint8만 지원됩니다. 더 높은 정밀도를 사용하면 경고가 표시되고 배열이 uint8으로 다운캐스트됩니다. 흑백 이미지의 경우 Pillow와 호환되는 한 원하는 정수 또는 부동소수점 정밀도를 사용할 수 있습니다. 이미지의 정수 또는 부동소수점 정밀도가 너무 높으면 경고가 표시되며, 이 경우 배열이 다운캐스트됩니다: int64 배열은 int32로, float64 배열은 float32로 다운캐스트됩니다.

메시 기능

Mesh 데이터셋에는 Mesh 타입의 컬럼이 있으며, 3D 메시 파일을 trimesh 객체로 로드합니다.

메시지 데이터셋을 로드하고 메시 컬럼을 호출하면 Mesh 기능이 메시 파일을 자동으로 디코딩합니다:

>>> from datasets import load_dataset, Mesh

>>> dataset = load_dataset("VINAY-UMRETHE/My-Mesh-Dataset", split="train")
>>> dataset[0]["mesh"]
<trimesh.Scene(len(geometry)=33)>

파일 내용에 따라 trimesh은 trimesh.Trimesh 객체 또는 trimesh.Scene 객체를 반환할 수 있습니다.

dataset[0]["mesh"]와 같이 행 인덱스를 먼저 사용하고 mesh 열을 인덱싱하여 메쉬 데이터셋에 접근하세요. 이렇게 하면 데이터셋의 모든 메쉬 파일을 디코딩하는 것을 방지할 수 있습니다. 그렇지 않으면 데이터셋이 크면 느리고 시간이 많이 걸리는 과정이 될 수 있습니다.

decode=False를 사용하면 Mesh 타입은 trimesh로 디코딩하지 않고 메시 파일의 경로 또는 바이트를 반환합니다:

>>> dataset = load_dataset("VINAY-UMRETHE/My-Mesh-Dataset", split="train").cast_column("mesh", Mesh(decode=False))
>>> dataset[0]["mesh"]
{'bytes': b'...',
 'path': '00001.glb'}

Mesh 기능은 .glb, .gltf, .ply, .stl 파일을 지원합니다. 임베디드 바이트의 경우, 저장된 path를 사용하여 메시 파일 유형을 추론합니다.

Json 기능

Datasets는 컬럼형 포맷인 Arrow를 기반으로 하므로, 모든 예시가 동일한 타입과 서브타입을 가지며, 사전은 동일한 키와 값 타입을 가져야 한다고 가정합니다. 데이터셋을 로드할 때 필드의 타입이 일치하지 않으면 오류가 발생하며, 사전에서 누락된 필드는 None으로 채워져 모든 사전이 동일한 키와 값 타입을 갖도록 합니다.

이 문제를 피하고 오류 없이 혼합된 유형을 허용하려면 on_mixed_types="use_json"을 사용하거나 Json 유형으로 features=를 지정할 수 있습니다:

>>> ds = Dataset.from_dict({"a": [0, "foo", {"subfield": "bar"}]})
Traceback (most recent call last):
  ...
  File "pyarrow/error.pxi", line 92, in pyarrow.lib.check_status
pyarrow.lib.ArrowInvalid: Could not convert 'foo' with type str: tried to convert to int64

>>> features = Features({"a": Json()})
>>> ds = Dataset.from_dict({"a": [0, "foo", {"subfield": "bar"}]}, features=features)
>>> ds.features
{'a': Json()}
>>> list(ds["a"])
[0, "foo", {"subfield": "bar"}]

임의의 키와 값을 가진 딕셔너리 목록에서도 누락된 필드를 None으로 채우는 것을 방지하기 위해 유용합니다:

>>> ds = Dataset.from_dict({"a": [[{"b": 0}, {"c": 0}]]})
>>> ds.features
{'a': List({'b': Value('int64'), 'c': Value('int64')})}
>>> list(ds["a"])
[[{'b': 0, 'c': None}, {'b': None, 'c': 0}]]  # missing fields are filled with None

>>> features = Features({"a": List(Json())})
>>> ds = Dataset.from_dict({"a": [[{"b": 0}, {"c": 0}]]}, features=features)
>>> ds.features
{'a': List(Json())}
>>> list(ds["a"])
[[{'b': 0}, {'c': 0}]]  # OK

on_mixed_types="use_json" 인수를 사용하는 도구 호출 데이터의 또 다른 예시입니다(features=를 수동으로 지정할 필요가 없으므로 유용합니다):

>>> messages = [
...     {"role": "user", "content": "Turn on the living room lights and play my electronic music playlist."},
...     {"role": "assistant", "tool_calls": [
...         {"type": "function", "function": {
...             "name": "control_light",
...             "arguments": {"room": "living room", "state": "on"}
...         }},
...         {"type": "function", "function": {
...             "name": "play_music",
...             "arguments": {"playlist": "electronic"}  # mixed-type here since keys ["playlist"] and ["room", "state"] are different
...         }}]
...     },
...     {"role": "tool", "name": "control_light", "content": "The lights in the living room are now on."},
...     {"role": "tool", "name": "play_music", "content": "The music is now playing."},
...     {"role": "assistant", "content": "Done!"}
... ]
>>> ds = Dataset.from_dict({"messages": [messages]}, on_mixed_types="use_json")
>>> ds.features
{'messages': List({'role': Value('string'), 'content': Value('string'), 'tool_calls': List(Json()), 'name': Value('string')})}
>>> ds[0][1]["tool_calls"][0]["function"]["arguments"]
{"room": "living room", "state": "on"}
Update on GitHub