数据集文档

数据集特征

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

数据集特征 (Dataset features)

Features (特征) 定义了数据集的内部结构。它用于指定底层的序列化格式。 然而,您更感兴趣的是 Features (特征) 包含有关所有内容的高级信息,从列名和类型,到 ClassLabel (类别标签)。您可以将 Features (特征) 视为数据集的骨干。

Features (特征) 格式很简单:dict[column_name, column_type]。它是一个列名和列类型对的字典。列类型为描述您拥有的数据类型提供了广泛的选择。

让我们看看来自 GLUE 基准测试的 MRPC 数据集的特征 (features)

>>> from datasets import load_dataset
>>> dataset = load_dataset('nyu-mll/glue', 'mrpc', split='train')
>>> dataset.features
{'idx': Value(dtype='int32', id=None),
 'label': ClassLabel(names=['not_equivalent', 'equivalent'], id=None),
 'sentence1': Value(dtype='string', id=None),
 'sentence2': Value(dtype='string', id=None),
}

Value (值) 特征告诉 🤗 Datasets

  • idx 数据类型是 int32
  • sentence1sentence2 数据类型是 string (字符串)。

🤗 Datasets 支持许多其他数据类型,例如 bool (布尔值)、float32 (32位浮点数) 和 binary (二进制) 等等。

有关支持的数据类型的完整列表,请参阅 Value (值)

ClassLabel (类别标签) 特征告知 🤗 Datasets label 列包含两个类别。这些类别被标记为 not_equivalent (不相等) 和 equivalent (相等)。标签以整数形式存储在数据集中。当您检索标签时,ClassLabel.int2str()ClassLabel.str2int() 执行从整数值到标签名称以及反之亦然的转换。

如果您的数据类型包含对象列表,那么您需要使用 Sequence (序列) 特征。还记得 SQuAD 数据集吗?

>>> from datasets import load_dataset
>>> dataset = load_dataset('rajpurkar/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 (32位整数) 的列表。

请参阅 flatten (展平) 部分,了解如何将嵌套的子字段提取为它们自己的独立列。

数组特征类型对于创建各种大小的数组非常有用。您可以使用 Array2D (二维数组) 创建二维数组,甚至可以使用 Array5D (五维数组) 创建五维数组。

>>> features = Features({'a': Array2D(shape=(1, 3), dtype='int32')})

数组类型还允许数组的第一个维度是动态的。这对于处理具有可变长度的序列(例如句子)非常有用,而无需将输入填充或截断为统一的形状。

>>> features = Features({'a': Array3D(shape=(None, 5, 2), dtype='int32')})

音频特征 (Audio feature)

音频数据集有一列类型为 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=FalseAudio (音频) 类型仅为您提供音频文件的路径或字节,而无需将其解码为 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 feature)

图像数据集有一列类型为 Image (图像),它从存储为字节的图像加载 PIL.Image 对象

当您加载图像数据集并调用图像列时,Image (图像) 特征会自动解码图像文件

>>> from datasets import load_dataset, Image

>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train")
>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x125506CF8>

使用行索引,然后使用 image 列 - dataset[0]["image"] - 索引到图像数据集,以避免解码数据集中的所有图像文件。否则,如果您有一个大型数据集,这可能是一个缓慢且耗时的过程。

使用 decode=FalseImage (图像) 类型仅为您提供图像文件的路径或字节,而无需将其解码为 PIL.Image

>>> dataset = load_dataset("AI-Lab-Makerere/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。

< > 在 GitHub 上更新