# 데이터셋 만들기

자체 데이터를 다루고 있다면 데이터셋을 생성해야 할 수 있습니다. 🤗 Datasets로 데이터셋을 생성하면 라이브러리의 모든 장점이 데이터셋에 적용됩니다: 빠른 로딩 및 처리, [대형 데이터셋 스트리밍](stream), [메모리 매핑](https://huggingface.co/course/chapter5/4?fw=pt#the-magic-of-memory-mapping) 등입니다. 🤗 Datasets의 로우코드 접근 방식을 사용하면 데이터셋을 쉽고 빠르게 생성할 수 있어 모델 학습을 시작하기까지 걸리는 시간을 줄일 수 있습니다. 많은 경우, Hub의 데이터셋 저장소에 데이터 파일을 [드래그 앤 드롭](upload_dataset#upload-with-the-hub-ui)하는 것만으로 충분합니다.

이 튜토리얼에서는 🤗 Datasets의 low-code 메서드를 사용하여 자체 데이터로 데이터셋을 만드는 방법을 배웁니다.

> **참고**
>
> 기존 데이터셋을 로드하는 방법 또는 로컬 및 원격 파일(CSV, JSON, Parquet 등)을 로드하는 방법을 배우려면 [로드 가이드](https://huggingface.co/docs/datasets/loading)를 참조하세요.

이 튜토리얼에서는 다음을 다룹니다:

- 이미지 또는 오디오 데이터셋을 빠르게 생성하기 위한 폴더 기반 빌더
- 로컬 Python 객체에서 데이터셋을 생성하기 위한 `from_` 메서드

## 파일 기반 빌더

🤗 Datasets는 `csv`, `json/jsonl`, `parquet`, `txt`와 같은 다양한 일반적인 포맷을 지원합니다.

예를 들어, 하나 이상의 CSV 파일로 구성된 데이터셋을 읽을 수 있습니다(이 경우 CSV 파일 목록을 전달하세요):

```py
>>> from datasets import load_dataset
>>> dataset = load_dataset("csv", data_files="my_file.csv")
```

지원되는 형식 목록과 코드 예시를 확인하려면 [여기](https://huggingface.co/docs/datasets/loading#local-and-remote-files)의 가이드를 따르세요.

## 폴더 기반 빌더

폴더 기반 빌더는 두 가지가 있습니다: `ImageFolder`와 `AudioFolder`. 이들은 수천 개의 예시로 구성된 이미지 또는 음성 및 오디오 데이터셋을 빠르게 생성하기 위한 로우코드 방법입니다. 더 큰 데이터셋으로 확장하기 전에 컴퓨터 비전 및 음성 모델을 신속하게 프로토타이핑하는 데 매우 유용합니다. 폴더 기반 빌더는 데이터를 받아 데이터셋의 특징, 분할, 라벨을 자동으로 생성합니다. 내부 동작 방식은 다음과 같습니다:

- `ImageFolder`은 [Image](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.Image) 기능을 사용하여 이미지 파일을 디코딩합니다. jpg, png와 같은 많은 이미지 확장자 형식이 지원되며, 다른 형식도 지원합니다. 지원되는 이미지 확장자의 전체 [목록](https://github.com/huggingface/datasets/blob/b5672a956d5de864e6f5550e493527d962d6ae55/src/datasets/packaged_modules/imagefolder/imagefolder.py#L39)을 확인할 수 있습니다.
- `AudioFolder`은 [Audio](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.Audio) 기능을 사용하여 오디오 파일을 디코딩합니다. wav, mp3, mp4와 같은 확장자가 지원되며, 지원되는 오디오 확장자의 전체 [목록](https://ffmpeg.org/ffmpeg-formats.html)을 확인할 수 있습니다. 디코딩은 ffmpeg를 통해 수행됩니다.

dataset의 분할은 저장소 구조에서 생성되며, 레이블 이름은 디렉터리 이름에서 자동으로 추론됩니다.

예를 들어, 이미지 데이터셋(오디오 데이터셋도 마찬가지입니다)이 다음과 같이 저장되어 있다고 가정해 보겠습니다:

```
pokemon/train/grass/bulbasaur.png
pokemon/train/fire/charmander.png
pokemon/train/water/squirtle.png

pokemon/test/grass/ivysaur.png
pokemon/test/fire/charmeleon.png
pokemon/test/water/wartortle.png
```

그렇다면 폴더 기반 빌더가 예시를 생성하는 방식은 다음과 같습니다:

  

`imagefolder`를 [load_dataset()](/docs/datasets/v5.2.0/ko/package_reference/loading_methods#datasets.load_dataset)에 지정하여 이미지 데이터셋을 생성합니다:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/pokemon")
```

오디오 데이터셋은 동일한 방식으로 생성되며, [load_dataset()](/docs/datasets/v5.2.0/ko/package_reference/loading_methods#datasets.load_dataset)에서 `audiofolder`를 지정하는 것만 다릅니다:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("audiofolder", data_dir="/path/to/folder")
```

데이터셋에 대한 추가 정보, 예를 들어 텍스트 캡션이나 전사 텍스트는 데이터셋이 포함된 폴더에 `metadata.csv` 파일로 포함할 수 있습니다. 메타데이터 파일에는 이미지 또는 오디오 파일을 해당 메타데이터와 연결하는 `file_name` 열이 있어야 합니다:

```
file_name, text
bulbasaur.png, There is a plant seed on its back right from the day this Pokémon is born.
charmander.png, It has a preference for hot things.
squirtle.png, When it retracts its long neck into its shell, it squirts out water with vigorous force.
```

각 폴더 기반 빌더에 대해 자세히 알아보려면 ImageFolder, AudioFolder 또는 MeshFolder 가이드를 확인하세요.

## Python 사전에서

Python 사전의 데이터로부터 데이터셋을 생성할 수도 있습니다. `from_` 메서드를 사용하여 데이터셋을 생성하는 방법은 두 가지입니다:

    * The [from_generator()](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.Dataset.from_generator) method is the most memory-efficient way to create a dataset from a [generator](https://wiki.python.org/moin/Generators) due to a generators iterative behavior. This is especially useful when you're working with a really large dataset that may not fit in memory, since the dataset is generated on disk progressively and then memory-mapped.

    ```py
    >>> from datasets import Dataset
    >>> def gen():
    ...     yield {"pokemon": "bulbasaur", "type": "grass"}
    ...     yield {"pokemon": "squirtle", "type": "water"}
    >>> ds = Dataset.from_generator(gen)
    >>> ds[0]
    {"pokemon": "bulbasaur", "type": "grass"}
    ```

    제너레이터 기반 [IterableDataset](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.IterableDataset)은 예를 들어 `for` 루프로 반복해야 합니다:

    ```py
    >>> from datasets import IterableDataset
    >>> ds = IterableDataset.from_generator(gen)
    >>> for example in ds:
    ...     print(example)
    {"pokemon": "bulbasaur", "type": "grass"}
    {"pokemon": "squirtle", "type": "water"}
    ```

    * [from_dict()](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.Dataset.from_dict) 메서드는 사전에서 데이터셋을 생성하는 직관적인 방법입니다:

    ```py
    >>> from datasets import Dataset
    >>> ds = Dataset.from_dict({"pokemon": ["bulbasaur", "squirtle"], "type": ["grass", "water"]})
    >>> ds[0]
    {"pokemon": "bulbasaur", "type": "grass"}
    ```

    이미지 또는 오디오 데이터셋을 만들려면 [cast_column()](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.Dataset.cast_column) 메서드를 [from_dict()](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.Dataset.from_dict)과 체이닝하여 컬럼과 기능 유형을 지정합니다. 예를 들어, 오디오 데이터셋을 만들려면:

    ```py
    >>> audio_dataset = Dataset.from_dict({"audio": ["path/to/audio_1", ..., "path/to/audio_n"]}).cast_column("audio", Audio())
    ```

이제 데이터셋을 만드는 방법을 알게 되셨으니, 커뮤니티도 여러분의 작업에서 혜택을 볼 수 있도록 Hub에 공유해 보세요. 다음 섹션으로 넘어가 데이터셋을 공유하는 방법을 배워 보세요.

