Datasets documentation
Conheça seu conjunto de dados
Conheça seu conjunto de dados
Existem dois tipos de objetos de dataset: um Dataset regular e um ✨ IterableDataset ✨. Um Dataset oferece acesso aleatório rápido às linhas e mapeamento de memória, de modo que a carga de datasets grandes utiliza apenas uma quantidade relativamente pequena de memória do dispositivo. Mas para datasets realmente, realmente grandes que nem sequer cabem no disco ou na memória, um IterableDataset permite acessar e usar o dataset sem esperar que ele seja baixado por completo!
Este tutorial mostrará como carregar e acessar um Dataset e um IterableDataset.
Conjunto de dados
Ao carregar uma divisão de um conjunto de dados, você obtém um objeto Dataset. É possível fazer muitas coisas com um objeto Dataset, por isso é importante aprender a manipular e interagir com os dados armazenados nele.
Este tutorial usa o conjunto de dados rotten_tomatoes, mas sinta-se à vontade para carregar qualquer conjunto de dados que desejar e seguir o processo!
>>> from datasets import load_dataset
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")Indexação
Um Dataset contém colunas de dados, e cada coluna pode ser de um tipo de dados diferente. O index, ou rótulo do eixo, é usado para acessar exemplos do conjunto de dados. Por exemplo, indexar pela linha retorna um dicionário com um exemplo do conjunto de dados:
# 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 o operador - para começar do final do conjunto de dados:
# 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 .'}A indexação pelo nome da coluna retorna uma lista de todos os valores da coluna:
>>> 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 .']Você pode combinar a indexação por nome de linha e coluna para retornar um valor específico em uma posição:
>>> 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 .'A ordem de indexação não importa. Indexar primeiro pelo nome da coluna retorna um objeto Column que você pode indexar normalmente com índices de linha:
>>> 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 secondsFatiamento
Slicing retorna uma fatia - ou subconjunto - do dataset, o que é útil para visualizar várias linhas de uma vez. Para fatiar um dataset, use o operador : para especificar um intervalo de posições.
# 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
Um IterableDataset é carregado quando você define o parâmetro streaming como True em 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}Você também pode criar um IterableDataset a partir de um Dataset existente, mas é mais rápido que o modo de streaming, pois o conjunto de dados é transmitido a partir de arquivos locais:
>>> from datasets import load_dataset
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")
>>> iterable_dataset = dataset.to_iterable_dataset()Um IterableDataset itera progressivamente sobre um conjunto de dados, um exemplo de cada vez, para que você não precise esperar o download de todo o conjunto de dados antes de usá-lo. Como você pode imaginar, isso é bastante útil para conjuntos de dados grandes que você deseja usar imediatamente!
Indexação
O comportamento de um IterableDataset é diferente do de um Dataset comum. Você não tem acesso aleatório aos exemplos em um IterableDataset. Em vez disso, você deve iterar sobre seus elementos, por exemplo, chamando next(iter()) ou usando um laço for para retornar o próximo item do 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}Mas um IterableDataset suporta indexação de colunas que retorna um iterável para os valores da coluna:
>>> next(iter(iterable_dataset["label"]))
6Criando um subconjunto
Você pode retornar um subconjunto do conjunto de dados com um número específico de exemplos usando 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}]Mas, ao contrário do slicing, o IterableDataset.take() cria um novo IterableDataset.
Próximas etapas
Interessado em saber mais sobre as diferenças entre esses dois tipos de conjuntos de dados? Saiba mais sobre eles no guia conceitual Diferenças entre Dataset e IterableDataset.
Para ter mais experiência prática com esses tipos de conjuntos de dados, consulte o guia Process para aprender a pré-processar um Dataset ou o guia Stream para aprender a pré-processar um IterableDataset.
Update on GitHub