Datasets documentation
Conoce tu conjunto de datos
Conoce tu conjunto de datos
Existen dos tipos de objetos de conjunto de datos: un Dataset regular y un ✨ IterableDataset ✨. Un Dataset proporciona acceso aleatorio rápido a las filas y memoria mapeada, de modo que la carga de conjuntos de datos grandes solo utiliza una cantidad relativamente pequeña de memoria del dispositivo. Pero para conjuntos de datos realmente, realmente grandes que ni siquiera caben en el disco o en la memoria, un IterableDataset te permite acceder y usar el conjunto de datos sin esperar a que se descargue por completo.
En este tutorial se mostrará cómo cargar y acceder a un Dataset y a un IterableDataset.
Dataset
Al cargar una división de un conjunto de datos, obtendrás un objeto Dataset. Puedes hacer muchas cosas con un objeto Dataset, por lo que es importante aprender a manipular e interactuar con los datos almacenados en su interior.
Este tutorial utiliza el conjunto de datos rotten_tomatoes, pero siéntase libre de cargar cualquier otro conjunto de datos que desee y seguir el proceso.
>>> from datasets import load_dataset
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")Indexación
Un Dataset contiene columnas de datos, y cada columna puede ser de un tipo de datos diferente. El index, o etiqueta de eje, se utiliza para acceder a los ejemplos del conjunto de datos. Por ejemplo, indexar por la fila devuelve un diccionario con un ejemplo del conjunto de datos:
# 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 .'}Use el operador - para empezar desde el final del conjunto de datos:
# 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 .'}Indexar por el nombre de la columna devuelve una lista con todos los valores de la columna:
>>> 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 .']Puede combinar la indexación por nombre de fila y columna para devolver un valor específico en una posición:
>>> 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 .'El orden de indexación no importa. Si se indexa primero por el nombre de la columna, se devuelve un objeto Column que se puede indexar de forma habitual con índices de fila:
>>> 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 secondsSlicing
Slicing devuelve una porción o subconjunto del conjunto de datos, lo cual es útil para ver varias filas a la vez. Para hacer slicing de un conjunto de datos, use el operador : para especificar un rango de posiciones.
# 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
Un IterableDataset se carga cuando se establece el parámetro streaming en True en 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}También puede crear un IterableDataset a partir de un Dataset existente, pero es más rápido que el modo de streaming porque el conjunto de datos se transmite desde archivos locales:
>>> from datasets import load_dataset
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")
>>> iterable_dataset = dataset.to_iterable_dataset()Un IterableDataset itera progresivamente sobre un conjunto de datos un ejemplo a la vez, por lo que no tienes que esperar a que se descargue todo el conjunto de datos antes de poder usarlo. Como puedes imaginar, ¡esto es bastante útil para conjuntos de datos grandes que quieres usar de inmediato!
Indexación
El comportamiento de un IterableDataset es diferente al de un Dataset regular. No se puede acceder aleatoriamente a los ejemplos de un IterableDataset. En su lugar, se debe iterar sobre sus elementos, por ejemplo, llamando a next(iter()) o con un bucle for para devolver el siguiente elemento del 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}Pero un IterableDataset admite la indexación de columnas que devuelve un iterable para los valores de la columna:
>>> next(iter(iterable_dataset["label"]))
6Creación de un subconjunto
Puede devolver un subconjunto del conjunto de datos con un número específico de ejemplos mediante 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}]Pero, a diferencia de el recorte, IterableDataset.take() crea un nuevo IterableDataset.
Próximos pasos
¿Le interesa saber más sobre las diferencias entre estos dos tipos de conjuntos de datos? Obtenga más información sobre ellos en la guía conceptual Diferencias entre Dataset y IterableDataset.
Para profundizar en estos tipos de conjuntos de datos, consulte la guía Process para aprender a preprocesar un Dataset o la guía Stream para aprender a preprocesar un IterableDataset.
Update on GitHub