了解您的数据集
数据集对象有两种类型,一种是常规的 Dataset,另一种是 ✨ IterableDataset ✨。 Dataset 提供对行的快速随机访问,以及内存映射,以便即使加载大型数据集也只需要相对较少的设备内存。但是,对于非常大的数据集(甚至无法完全放入磁盘或内存中),IterableDataset 允许您访问和使用数据集,而无需等待它完全下载!
本教程将向您展示如何加载和访问 Dataset 和 IterableDataset。
数据集
当您加载数据集切分时,您将获得一个 Dataset 对象。您可以使用 Dataset 对象执行许多操作,因此学习如何操作和交互存储在其中的数据非常重要。
本教程使用 rotten_tomatoes 数据集,但您可以随意加载任何您喜欢的数据集并继续学习!
>>> from datasets import load_dataset
>>> dataset = load_dataset("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 .'
但必须记住,索引顺序很重要,尤其是在处理大型音频和图像数据集时。按列名索引首先返回该列中的所有值,然后加载该位置的值。对于大型数据集,按列名索引可能速度较慢。
>>> 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.0094 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 .']}
可迭代数据集
当您在 load_dataset() 中将 streaming
参数设置为 True
时,将加载 IterableDataset
>>> from datasets import load_dataset
>>> iterable_dataset = load_dataset("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}
您还可以从现有 Dataset 创建 IterableDataset,但它比流模式更快,因为数据集是从本地文件流式传输的
>>> from datasets import load_dataset
>>> dataset = load_dataset("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.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
之间的差异 概念指南中了解更多信息。
要更深入地了解这些数据集类型,请查看 处理 指南以了解如何预处理 Dataset 或 流 指南以了解如何预处理 IterableDataset。
< > 在 GitHub 上更新