내 데이터셋 알기
내 데이터셋 알기 (Know Your Dataset)
데이터셋 객체에는 두 가지 유형이 있어요. 일반 Dataset과 ✨ IterableDataset ✨ 이죠. Dataset은 행에 빠른 랜덤 접근을 제공하고, 메모리 매핑(memory-mapping) 덕분에 큰 데이터셋을 불러와도 비교적 적은 장치 메모리만 사용해요.
하지만 디스크나 메모리에 아예 들어가지 않을 만큼 정말, 정말 큰 데이터셋이라면 IterableDataset을 쓰면 다운로드가 완료되기를 기다리지 않고 데이터셋에 접근해 사용할 수 있어요!
Dataset
데이터셋 split을 불러오면 Dataset 객체를 얻게 돼요. Dataset 객체로 할 수 있는 일이 많아서, 안에 저장된 데이터를 어떻게 다루고 상호작용하는지 배우는 게 중요합니다.
이 튜토리얼은 rotten_tomatoes 데이터셋을 사용하지만, 원하는 데이터셋을 아무거나 불러와 따라 해도 돼요.
>>> from datasets import load_dataset
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")
인덱싱 (Indexing)
데이터셋에는 컬럼이 있고, 각 컬럼은 각기 다른 유형의 데이터일 수 있어요. 인덱스 또는 축 레이블은 데이터셋에서 예시에 접근하는 데 쓰여요. 예를 들어 행으로 인덱싱하면 데이터셋의 예시인 딕셔너리를 반환해요.
# 데이터셋의 첫 행 가져오기
>>> dataset[0]
{'label': 1,
'text': 'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'}
- 연산자를 쓰면 데이터셋의 끝에서부터 시작할 수 있어요.
# 데이터셋의 마지막 행 가져오기
>>> dataset[-1]
{'label': 0,
'text': 'things really get weird , though not particularly scary : the movie is all portent and no content .'}
컬럼 이름으로 인덱싱하면 컬럼의 모든 값 리스트를 반환해요.
>>> dataset["text"]
['the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .',
...
'things really get weird , though not particularly scary : the movie is all portent and no content .']
행 인덱싱과 컬럼 이름 인덱싱을 결합하면 특정 위치의 특정 값을 반환할 수 있어요.
>>> dataset[0]["text"]
'the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .'
인덱싱 순서는 상관없어요. 먼저 컬럼 이름으로 인덱싱하면 Column 객체가 반환되고, 이를 행 인덱스로 평소처럼 인덱싱할 수 있어요.
슬라이싱 (Slicing)
슬라이싱은 데이터셋의 슬라이스 — 또는 하위 집합 — 을 반환하며, 여러 행을 한 번에 보는 데 유용해요. 데이터셋을 슬라이스하려면 : 연산자로 위치 범위를 지정하세요.
# 처음 세 행 가져오기
>>> dataset[:3]
{'label': [1, 1, 1],
'text': ['the rock is destined to be the 21st century\'s new " conan " and that he\'s going to make a splash even greater than arnold schwarzenegger , jean-claud van damme or steven segal .',
'the gorgeously elaborate continuation of " the lord of the rings " trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j . r . r . tolkien\'s middle-earth .',
'effective but too-tepid biopic']}
# 3과 6 사이의 행 가져오기
>>> dataset[3:6]
IterableDataset
IterableDataset은 load_dataset()에서 streaming 파라미터를 True로 설정하면 불러와져요.
>>> from datasets import load_dataset
>>> iterable_dataset = load_dataset("ethz/food101", split="train", streaming=True)
>>> for example in iterable_dataset:
... print(example)
... break
{'image': , 'label': 6}
기존 Dataset에서도 IterableDataset을 만들 수 있는데, 데이터가 로컬 파일에서 스트리밍되므로 스트리밍 모드보다 더 빨라요.
>>> from datasets import load_dataset
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")
>>> iterable_dataset = dataset.to_iterable_dataset()
IterableDataset은 데이터셋을 한 번에 한 예시씩 점진적으로 순회하므로, 전체 데이터셋이 다운로드되기를 기다리지 않고 사용할 수 있어요. 상상할 수 있듯이, 바로 사용하고 싶은 큰 데이터셋에 꽤 유용합니다!
인덱싱
IterableDataset의 동작은 일반 Dataset과 달라요. IterableDataset에서는 예시에 랜덤 접근이 되지 않아요. 대신 next(iter())를 호출하거나 for 루프로 그 요소들을 순회해서 IterableDataset의 다음 항목을 반환해야 해요.
>>> next(iter(iterable_dataset))
{'image': ,
'label': 6}
>>> for example in iterable_dataset:
... print(example)
... break
{'image': , 'label': 6}
하지만 IterableDataset은 컬럼 값에 대한 이터러블을 반환하는 컬럼 인덱싱을 지원해요.
>>> next(iter(iterable_dataset["label"]))
6
하위 집합 만들기
IterableDataset.take()로 특정 개수의 예시를 담은 데이터셋 하위 집합을 반환할 수 있어요.
# 처음 세 예시 가져오기
>>> list(iterable_dataset.take(3))
[{'image': ,
'label': 6},
{'image': ,
'label': 6},
{'image': ,
'label': 6}]
하지만 슬라이싱과 달리 IterableDataset.take()는 새 IterableDataset을 만들어요.
다음 단계
이 두 데이터셋 유형의 차이에 대해 더 배우고 싶다면 Dataset과 IterableDataset의 차이 개념 가이드를 읽어보세요.
직접 해보면서 더 배우고 싶다면 Process 가이드로 Dataset을 전처리하거나 Stream 가이드로 IterableDataset을 전처리하는 법을 확인해 보세요.
출처: 공식문서