数据集特征
特征 定义了数据集的内部结构。它用于指定底层的序列化格式。更重要的是,特征 包含从列名和类型到 ClassLabel 的所有内容的高级信息。您可以将 特征 视为数据集的骨干。
格式很简单:dict[column_name, column_type]
。它是一个列名和列类型对的字典。列类型提供了广泛的选项来描述您拥有的数据类型。
让我们看一下 GLUE 基准测试中 MRPC 数据集的特征
>>> from datasets import load_dataset
>>> dataset = load_dataset('glue', 'mrpc', split='train')
>>> dataset.features
{'idx': Value(dtype='int32', id=None),
'label': ClassLabel(num_classes=2, names=['not_equivalent', 'equivalent'], names_file=None, id=None),
'sentence1': Value(dtype='string', id=None),
'sentence2': Value(dtype='string', id=None),
}
值 特征告诉 🤗 数据集
idx
数据类型是int32
。sentence1
和sentence2
数据类型是string
。
🤗 数据集支持许多其他数据类型,例如 bool
、float32
和 binary
,仅举几例。
有关支持数据类型的完整列表,请参考 值。
The ClassLabel 特性告知 🤗 Datasets label
列包含两个类别。这两个类别分别标记为 not_equivalent
和 equivalent
。标签在数据集中存储为整数。当您检索标签时,ClassLabel.int2str() 和 ClassLabel.str2int() 会执行从整数值到标签名称的转换,反之亦然。
如果您的数据类型包含对象列表,则您需要使用 Sequence 特性。还记得 SQuAD 数据集吗?
>>> from datasets import load_dataset
>>> dataset = load_dataset('squad', split='train')
>>> dataset.features
{'answers': Sequence(feature={'text': Value(dtype='string', id=None), 'answer_start': Value(dtype='int32', id=None)}, length=-1, id=None),
'context': Value(dtype='string', id=None),
'id': Value(dtype='string', id=None),
'question': Value(dtype='string', id=None),
'title': Value(dtype='string', id=None)}
answers
字段使用 Sequence 特性构建,因为它包含两个子字段:text
和 answer_start
,它们分别是 string
和 int32
的列表。
请参阅 flatten 部分,了解如何将嵌套子字段提取为其各自的独立列。
数组特性类型对于创建各种大小的数组非常有用。您可以使用 Array2D 创建具有两个维度的数组,甚至可以使用 Array5D 创建具有五个维度的数组。
>>> features = Features({'a': Array2D(shape=(1, 3), dtype='int32')})
数组类型还允许数组的第一维是动态的。这对于处理具有可变长度的序列(如句子)非常有用,而无需将输入填充或截断为统一形状。
>>> features = Features({'a': Array3D(shape=(None, 5, 2), dtype='int32')})
音频特性
音频数据集有一列类型为 Audio,它包含三个重要字段
array
:表示为一维数组的解码音频数据。path
:下载的音频文件的路径。sampling_rate
:音频数据的采样率。
当您加载音频数据集并调用音频列时,Audio 特性会自动解码和重新采样音频文件
>>> from datasets import load_dataset, Audio
>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train")
>>> dataset[0]["audio"]
{'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414,
0. , 0. ], dtype=float32),
'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
'sampling_rate': 8000}
使用行索引,然后是 audio
列来索引音频数据集 - dataset[0]["audio"]
- 以避免解码和重新采样数据集中所有音频文件。否则,如果您有大型数据集,这将是一个缓慢且耗时的过程。
使用 decode=False
时,Audio 类型只为您提供音频文件的路径或字节,而不会将其解码为 array
,
>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train").cast_column("audio", Audio(decode=False))
>>> dataset[0]
{'audio': {'bytes': None,
'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav'},
'english_transcription': 'I would like to set up a joint account with my partner',
'intent_class': 11,
'lang_id': 4,
'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
'transcription': 'I would like to set up a joint account with my partner'}
图像特性
图像数据集有一列类型为 Image,它从存储为字节的图像中加载 PIL.Image
对象
当您加载图像数据集并调用图像列时,Image 特性会自动解码图像文件
>>> from datasets import load_dataset, Image
>>> dataset = load_dataset("beans", split="train")
>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x125506CF8>
使用行索引,然后是 image
列来索引图像数据集 - dataset[0]["image"]
- 以避免解码数据集中所有图像文件。否则,如果您有大型数据集,这将是一个缓慢且耗时的过程。
使用 decode=False
时,Image 类型只为您提供图像文件的路径或字节,而不会将其解码为 PIL.Image
,
>>> dataset = load_dataset("beans", split="train").cast_column("image", Image(decode=False))
>>> dataset[0]["image"]
{'bytes': None,
'path': '/Users/username/.cache/huggingface/datasets/downloads/extracted/772e7c1fba622cff102b85dd74bcce46e8168634df4eaade7bedd3b8d91d3cd7/train/healthy/healthy_train.265.jpg'}
根据数据集的不同,您可能会获得本地下载图像的路径,或者如果数据集不是由单个文件组成,则获得图像内容的字节。
您还可以定义一个从 numpy 数组创建的图像数据集
>>> ds = Dataset.from_dict({"i": [np.zeros(shape=(16, 16, 3), dtype=np.uint8)]}, features=Features({"i": Image()}))
在这种情况下,numpy 数组将被编码为 PNG(如果像素值精度很重要,则为 TIFF)。
对于 RGB 或 RGBA 之类的多通道数组,仅支持 uint8。如果您使用更大的精度,您将收到警告,并且数组将被降级为 uint8。对于灰度图像,您可以使用您想要的整数或浮点精度,只要它与 Pillow
兼容即可。如果您的图像整数或浮点精度过高,则会显示警告,在这种情况下,数组将被降级:int64 数组将被降级为 int32,float64 数组将被降级为 float32。