Datasets documentation

Connaître votre jeu de données

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Connaître votre jeu de données

Il existe deux types d’objets de jeu de données : le Dataset classique et le ✨ IterableDataset ✨. Un Dataset offre un accès aléatoire rapide aux lignes et un mappage mémoire, de sorte que le chargement de jeux de données volumineux n’utilise qu’une quantité relativement faible de mémoire sur l’appareil. Mais pour les jeux de données vraiment, vraiment énormes qui ne tiennent même pas sur le disque ou en mémoire, un IterableDataset permet d’accéder au jeu de données et de l’utiliser sans attendre qu’il soit entièrement téléchargé !

Ce tutoriel vous montre comment charger et accéder à un Dataset et à un IterableDataset.

Jeu de données

Lorsque vous chargez une partie d’un jeu de données, vous obtenez un objet Dataset. Vous pouvez effectuer de nombreuses opérations avec un objet Dataset, c’est pourquoi il est important d’apprendre à manipuler et à interagir avec les données qu’il contient.

Ce tutoriel utilise le jeu de données rotten_tomatoes, mais n’hésitez pas à charger le jeu de données de votre choix et à suivre le guide !

>>> from datasets import load_dataset

>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")

Indexation

Un Dataset contient des colonnes de données, et chaque colonne peut être de type différent. L'index, ou étiquette d'axe, est utilisé pour accéder aux exemples du jeu de données. Par exemple, l'indexation par ligne renvoie un dictionnaire contenant un exemple du jeu de données :

# 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 .'}

Utilisez l'opérateur - pour commencer à partir de la fin du jeu de données :

# 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 .'}

L'indexation par le nom de la colonne renvoie une liste de toutes les valeurs de la colonne :

>>> 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 .']

Vous pouvez combiner l’indexation par nom de ligne et par nom de colonne pour retourner une valeur spécifique à une position donnée :

>>> 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 .'

L’ordre d’indexation n’a pas d’importance. L’indexation par le nom de la colonne renvoie d’abord un objet Column que vous pouvez indexer comme d’habitude avec des indices de ligne :

>>> 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

Découpage

La découpe renvoie une tranche, ou sous-ensemble, du jeu de données, ce qui est utile pour afficher plusieurs lignes à la fois. Pour découper un jeu de données, utilisez l'opérateur : pour spécifier une plage de positions.

# 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 est chargé lorsque vous définissez le paramètre streaming sur True dans 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}

Vous pouvez également créer un IterableDataset à partir d'un Dataset existant, mais c'est plus rapide que le mode streaming car le jeu de données est diffusé depuis des fichiers locaux :

>>> from datasets import load_dataset

>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")
>>> iterable_dataset = dataset.to_iterable_dataset()

Un IterableDataset itère progressivement sur un jeu de données, un exemple à la fois, ce qui vous évite d’attendre le téléchargement complet du jeu de données avant de pouvoir l’utiliser. Comme vous pouvez l’imaginer, c’est très pratique pour les grands jeux de données que vous souhaitez utiliser immédiatement !

Indexation

Le comportement d'un IterableDataset diffère de celui d'un Dataset classique. Vous n'avez pas d'accès aléatoire aux exemples d'un IterableDataset. À la place, vous devez itérer sur ses éléments, par exemple en appelant next(iter()) ou avec une boucle for pour récupérer l'élément suivant du 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}

Mais un IterableDataset prend en charge l’indexation par colonne, qui renvoie un itérable pour les valeurs de la colonne :

>>> next(iter(iterable_dataset["label"]))
6

Créer un sous-ensemble

Vous pouvez retourner un sous-ensemble du jeu de données contenant un nombre spécifique d'exemples avec 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}]

Mais contrairement au tranchage, IterableDataset.take() crée un nouvel IterableDataset.

Étapes suivantes

Envie d'en savoir plus sur les différences entre ces deux types de jeux de données ? Découvrez-les dans le guide conceptuel Différences entre Dataset et IterableDataset.

Pour approfondir ces types de jeux de données, consultez le guide Process pour apprendre à prétraiter un Dataset ou le guide Stream pour apprendre à prétraiter un IterableDataset.

Update on GitHub