Datasets documentation
Знакомство с набором данных
Знакомство с набором данных
Существует два типа объектов датасетов: обычный Dataset и ✨ IterableDataset ✨. Dataset обеспечивает быстрый случайный доступ к строкам и использует отображение в память (memory-mapping), благодаря чему загрузка даже больших датасетов требует относительно небольшого объёма памяти устройства. Однако для действительно очень больших датасетов, которые не помещаются даже на диске или в оперативной памяти, IterableDataset позволяет получать доступ к данным и использовать их, не дожидаясь полной загрузки!
В этом учебном материале показано, как загрузить и получить доступ к Dataset и IterableDataset.
Набор данных
При загрузке разбиения набора данных вы получаете объект Dataset. С объектом Dataset можно выполнять множество операций, поэтому важно научиться работать с данными, хранящимися внутри него.
В этом учебном материале используется набор данных rotten_tomatoes, но вы можете загрузить любой другой набор данных и следовать инструкциям!
>>> from datasets import load_dataset
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")Индексация
Объект Dataset содержит столбцы данных, и каждый столбец может иметь разный тип данных. Индекс, или метка оси, используется для доступа к примерам из набора данных. Например, обращение по строке возвращает словарь с примером из набора данных:
# Get the first row in the dataset
>>> 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 .'}Используйте оператор -, чтобы начать с конца набора данных:
# Get the last row in the dataset
>>> 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 .',
'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',
...,
'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, который можно индексировать обычным образом с помощью индексов строк:
>>> import time
>>> start_time = time.time()
>>> text = dataset[0]["text"]
>>> end_time = time.time()
>>> print(f"Elapsed time: {end_time - start_time:.4f} seconds")
Elapsed time: 0.0031 seconds
>>> start_time = time.time()
>>> text = dataset["text"][0]
>>> end_time = time.time()
>>> print(f"Elapsed time: {end_time - start_time:.4f} seconds")
Elapsed time: 0.0042 secondsСрез
Срез возвращает срез — или подмножество — набора данных, что удобно для просмотра нескольких строк сразу. Чтобы сделать срез набора данных, используйте оператор : для указания диапазона позиций.
# Get the first three rows
>>> 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']}
# Get rows between three and six
>>> dataset[3:6]
{'label': [1, 1, 1],
'text': ['if you sometimes like to go to the movies to have fun , wasabi is a good place to start .',
"emerges as something rare , an issue movie that's so honest and keenly observed that it doesn't feel like one .",
'the film provides some great insight into the neurotic mindset of all comics -- even those who have reached the absolute top of the game .']}IterableDataset
Объект IterableDataset загружается, если установить параметр streaming в значение True в load_dataset():
>>> from datasets import load_dataset
>>> iterable_dataset = load_dataset("ethz/food101", split="train", streaming=True)
>>> for example in iterable_dataset:
... print(example)
... break
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=384x512 at 0x7F0681F5C520>, 'label': 6}Вы также можете создать IterableDataset из существующего Dataset, но это быстрее, чем стриминговый режим, поскольку датасет загружается из локальных файлов:
>>> 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': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=384x512 at 0x7F0681F59B50>,
'label': 6}
>>> for example in iterable_dataset:
... print(example)
... break
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=384x512 at 0x7F7479DE82B0>, 'label': 6}Однако IterableDataset поддерживает индексирование по столбцам, возвращающее итерируемый объект для значений столбца:
>>> next(iter(iterable_dataset["label"]))
6Создание подмножества
Вы можете вернуть подмножество набора данных с определённым числом примеров с помощью IterableDataset.take():
# Get first three examples
>>> list(iterable_dataset.take(3))
[{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=384x512 at 0x7F7479DEE9D0>,
'label': 6},
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x512 at 0x7F7479DE8190>,
'label': 6},
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x383 at 0x7F7479DE8310>,
'label': 6}]В отличие от вырезания, IterableDataset.take() создаёт новый IterableDataset.
Дальнейшие шаги
Хотите узнать больше о различиях между этими двумя типами наборов данных? Подробнее о них читайте в концептуальном руководстве Различия между Dataset и IterableDataset.
Чтобы глубже разобраться в этих типах наборов данных, обратитесь к руководству Process, чтобы узнать, как предобработать Dataset, или к руководству Stream, чтобы узнать, как предобработать IterableDataset.
Update on GitHub