speechbrain.dataio.dataset 模块

加载单个数据点的数据集示例

Authors
  • 阿库·柔赫 2020

  • 萨穆埃莱·科内尔 2020

摘要

类:

DynamicItemDataset

读取、处理并生成字典的数据集。

FilteredSortedDynamicItemDataset

可能是过滤的,可能是排序的 DynamicItemDataset。

函数:

add_dynamic_item

用于将相同项目添加到多个数据集的辅助工具。

apply_overfit_test

对指定的数据集应用过拟合测试,如超参数文件中配置的那样

set_output_keys

用于将相同项目设置到多个数据集的辅助工具。

参考

class speechbrain.dataio.dataset.DynamicItemDataset(data, dynamic_items=[], output_keys=[])[source]

基础类:Dataset

读取、整理并生成字典的数据集。

每个数据点字典提供了一些项目(通过键),例如,带有键“wav_file”的波形文件路径。当从这个数据集中获取数据点时,会基于预先存在的项目和其他动态创建的项目动态生成更多项目。例如,一个动态项目可以获取波形文件路径并从磁盘加载音频。

动态项可以依赖于其他动态项:只要没有循环依赖,就会自动使用合适的评估顺序。

在输出字典中收集指定的键列表。这些可以是原始数据中的项目或动态项目。如果某些动态项目未被请求,也不被其他请求的项目所依赖,它们将不会被计算。因此,例如,如果用户只想遍历文本,则可以跳过耗时的音频加载。

关于格式: 接受一个字典的字典作为数据点的集合进行读取/整理。 顶层键是数据点ID。 每个数据点(示例)字典应具有相同的键,对应于该数据点中的不同项。

数据收集的整体过程可能如下所示:

>>> data = {
...  "spk1utt1": {
...      "wav_file": "/path/to/spk1utt1.wav",
...      "text": "hello world",
...      "speaker": "spk1",
...      },
...  "spk1utt2": {
...      "wav_file": "/path/to/spk1utt2.wav",
...      "text": "how are you world",
...      "speaker": "spk1",
...      }
... }

注意

顶级键,数据点ID,隐式地作为数据点中的一个项添加,键为“id”

每个动态项目由三件事配置:一个键、一个函数和一个参数键列表。键在每个数据点中的所有项目(动态或非动态)中应该是唯一的。函数可以是任何可调用的,它返回动态项目的值。可调用函数使用由参数键列表指定的其他项目的值进行调用(作为位置参数,按照参数键指定的顺序传递)。

dynamic_items 配置可能如下所示:

>>> import torch
>>> dynamic_items = [
...     {"func": lambda l: torch.Tensor(l),
...     "takes": ["wav_loaded"],
...     "provides": "wav"},
...     {"func": lambda path: [ord(c)/100 for c in path],  # Fake "loading"
...     "takes": ["wav_file"],
...     "provides": "wav_loaded"},
...     {"func": lambda t: t.split(),
...     "takes": ["text"],
...     "provides": "words"}]

通过这些,可以加载数据的不同视图:

>>> from speechbrain.dataio.dataloader import SaveableDataLoader
>>> from speechbrain.dataio.batch import PaddedBatch
>>> dataset = DynamicItemDataset(data, dynamic_items)
>>> dataloader = SaveableDataLoader(dataset, collate_fn=PaddedBatch,
...     batch_size=2)
>>> # First, create encoding for words:
>>> dataset.set_output_keys(["words"])
>>> encoding = {}
>>> next_id = 1
>>> for batch in dataloader:
...     for sent in batch.words:
...         for word in sent:
...             if word not in encoding:
...                 encoding[word] = next_id
...                 next_id += 1
>>> # Next, add an encoded words_tensor dynamic item:
>>> dataset.add_dynamic_item(
...     func = lambda ws: torch.tensor([encoding[w] for w in ws],
...             dtype=torch.long),
...     takes = ["words"],
...     provides = "words_encoded")
>>> # Now we can get word and audio tensors:
>>> dataset.set_output_keys(["id", "wav", "words_encoded"])
>>> batch = next(iter(dataloader))
>>> batch.id
['spk1utt1', 'spk1utt2']
>>> batch.wav  # +ELLIPSIS
PaddedData(data=tensor([[0.4700, 1.1200, ...
>>> batch.words_encoded
PaddedData(data=tensor([[1, 2, 0, 0],
        [3, 4, 5, 2]]), lengths=tensor([0.5000, 1.0000]))

输出键也可以是一个映射:

>>> dataset.set_output_keys({"id":"id", "signal": "wav", "words": "words_encoded"})
>>> batch = next(iter(dataloader))
>>> batch.words
PaddedData(data=tensor([[1, 2, 0, 0],
        [3, 4, 5, 2]]), lengths=tensor([0.5000, 1.0000]))
Parameters:
  • data (dict) – 包含单个数据点(例如话语)的字典。

  • dynamic_items (list, optional) –

    获取示例时生成的动态项的配置。 DynamicItems 列表或具有以下格式的字典:

    func: <callable> # 待调用
    takes: <list> # 此函数接受的参数键或键列表
    provides: key # 此函数提供的键或键列表
    

  • output_keys (dict, list, optional) –

    要包含在获取数据点时的输出字典中的键列表(可以直接在数据中获取或动态生成)。

    如果给出的是字典;它用于将内部键映射到输出键。 在output_keys字典的键值对中,键出现在外部,值是内部键。

add_dynamic_item(func, takes=None, provides=None)[source]

使数据集上可用的新动态项。

两种调用约定。对于DynamicItem对象,只需使用: add_dynamic_item(dynamic_item)。 但除此之外,应该使用: add_dynamic_item(func, takes, provides)。

参见 speechbrain.utils.data_pipeline.

Parameters:
  • func (callable, DynamicItem) – 如果提供了 DynamicItem,则直接添加。否则,创建一个 DynamicItem,并指定要使用的可调用对象。如果提供了生成器函数,则创建一个 GeneratorDynamicItem。否则,创建一个普通的 DynamicItem。

  • takes (list, str) – 键的列表。当调用 func 时,每个键会被解析为数据中的一个条目或另一个 dynamic_item 的输出。然后,func 会以这些作为位置参数被调用,顺序与此处指定的顺序相同。可以直接给出单个参数。

  • 提供 (str) – 此提供的唯一键或键。

set_output_keys(keys)[source]

使用此功能来更改输出键。

这些是当从数据集中获取数据点时实际评估的键。

Parameters:

keys (dict, list) –

要在输出中生成的键(str)列表。

如果给定了一个字典;它用于将内部键映射到输出键。 从output_keys字典的键值对中,键出现在外部, 值是内部键。

output_keys_as(keys)[source]

上下文管理器用于临时设置输出键。

Parameters:

keys (list) – 在上下文中使用的一组输出键。

Example

>>> dataset = DynamicItemDataset({"a":{"x":1,"y":2},"b":{"x":3,"y":4}},
...     output_keys = ["x"])
>>> with dataset.output_keys_as(["y"]):
...     print(dataset[0])
{'y': 2}
>>> print(dataset[0])
{'x': 1}

注意

非线程安全。在此上下文管理器中,任何调用的输出键都会受到影响。

Yields:

self

filtered_sorted(key_min_value={}, key_max_value={}, key_test={}, sort_key=None, reverse=False, select_n=None)[source]

获取此数据的过滤和/或排序版本,共享静态数据。

在同一方法中实现这些操作的原因是,计算某些动态项可能很昂贵,这样过滤和排序步骤就不需要两次计算动态项。

Parameters:
  • key_min_value (dict) – 从键(在数据或动态项中)到限制的映射,只有当 data_point[key] >= limit 时才会保留数据点

  • key_max_value (dict) – 从键(在数据或动态项中)到限制的映射,只有当 data_point[key] <= limit 时才会保留数据点

  • key_test (dict) – 从键(在数据或动态项中)到函数的映射,只有当 bool(func(data_point[key])) == True 时才会保留数据点

  • sort_key (None, str) – 如果不为None,则按data_point[sort_key]排序。默认为升序。

  • reverse (bool) – 如果为True,则按降序排序。

  • select_n (None, int) – 如果不是None,只保留(最多)前n个过滤后的数据点。 可能的排序会被应用,但仅针对找到的前n个数据点。用于调试。

Returns:

共享静态数据,但拥有自己的输出键和动态项(最初从此处深度复制,因此它们具有相同的可用动态项)

Return type:

FilteredSortedDynamicItemDataset

注意

暂时更改输出键!

overfit_test(sample_count, total_count)[source]

创建此数据集的子集用于过拟合测试 - 重复 sample_count 样本以创建一个包含总共 epoch_data_count 样本的重复数据集

Parameters:
  • sample_count (int) – 要选择的样本数量

  • total_count (int) – 总数据计数

Returns:

dataset – 一个包含重复子集的数据集

Return type:

FilteredSortedDynamicItemDataset

batch_shuffle(batch_size)[source]

在数据集中打乱批次。这在结合长度排序时特别有用 - 确保批次内的长度变化不大,但批次本身保持随机化。

Parameters:

batch_size (int) – 批量大小

Returns:

dataset – 一个经过打乱的数据集

Return type:

FilteredSortedDynamicItemDataset

classmethod from_json(json_path, replacements={}, dynamic_items=[], output_keys=[])[source]

加载一个数据准备JSON文件并基于它创建一个数据集。

classmethod from_csv(csv_path, replacements={}, dynamic_items=[], output_keys=[])[source]

加载一个数据准备CSV文件并基于它创建一个数据集。

classmethod from_arrow_dataset(dataset, replacements={}, dynamic_items=[], output_keys=[])[source]

加载一个准备好的huggingface数据集

class speechbrain.dataio.dataset.FilteredSortedDynamicItemDataset(from_dataset, data_ids)[source]

基础类: DynamicItemDataset

可能是经过过滤或排序的DynamicItemDataset。

共享静态数据(参考)。 拥有自己的dynamic_items和output_keys(深拷贝)。

classmethod from_json(json_path, replacements={}, dynamic_items=None, output_keys=None)[source]
classmethod from_csv(csv_path, replacements={}, dynamic_items=None, output_keys=None)[source]
speechbrain.dataio.dataset.add_dynamic_item(datasets, func, takes=None, provides=None)[source]

用于将相同项目添加到多个数据集的助手。

speechbrain.dataio.dataset.set_output_keys(datasets, output_keys)[source]

用于将相同项目设置到多个数据集的助手。

speechbrain.dataio.dataset.apply_overfit_test(overfit_test, overfit_test_sample_count, overfit_test_epoch_data_count, dataset)[source]

将过拟合测试应用于指定的数据集,如超参数文件中配置的那样

Parameters:
  • overfit_test (bool) – 当为True时,执行过拟合测试

  • overfit_test_sample_count (int) – 过拟合测试的样本数量

  • overfit_test_epoch_data_count (int) – 过拟合测试的epoch数量

  • 数据集 (DynamicItemDataset) – 数据集

Returns:

dataset – 数据集,应用了过拟合测试

Return type:

DynamicItemDataset