speechbrain.dataio.dataset 模块

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

作者
  • Aku Rouhe 2020

  • Samuele Cornell 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

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

每个数据点字典(dict)提供一些项(按键),例如,使用键“wav_file”表示 wavefile 的路径。当从这个 Dataset 中获取一个数据点时,会根据已有的项和其他动态创建的项动态生成更多的项。例如,动态项可以获取 wavefile 路径并从磁盘加载音频。

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

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

关于格式:接受一个字典的字典(dict of dicts)作为要读取/处理的数据点集合。顶层键是数据点 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”

每个动态项由三部分配置:一个键(key),一个函数(func),以及一个参数键列表(argkeys)。键在每个数据点中所有项(动态或非动态)中应该是唯一的。func 是任何可调用对象,它返回动态项的值。该可调用对象会以 argkeys 列表中指定的其他项的值作为位置参数调用,并按 argkeys 中指定的顺序传递。

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]))
参数:
  • data (dict) – 包含单个数据点(例如,话语)的字典。

  • dynamic_items (list, optional) –

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

    func: <callable> # To be called
    takes: <list> # key or list of keys of args this takes
    provides: key # key or list of keys that this provides
    

  • 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

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

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

  • provides (str) – 此项提供的唯一键或多个键。

set_output_keys(keys)[source]

使用此方法更改输出键。

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

参数:

keys (dict, list) –

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

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

output_keys_as(keys)[source]

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

参数:

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

示例

>>> 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}

注意

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

产生:

self

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

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

在同一个方法中实现这些操作的原因是,计算某些动态项可能开销很大,通过这种方式,过滤和排序步骤无需计算动态项两次。

参数:
  • key_min_value (dict) – 从键(数据中或动态项中)到限制的映射,仅保留 data_point[key] >= limit 的数据点

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

  • key_test (dict) – 从键(数据中或动态项中)到 func 的映射,仅保留 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 个数据点。 intended 用于调试。

返回:

共享静态数据,但有自己的输出键和动态项(最初从这个数据集进行深拷贝,因此它们具有相同的可用动态项)

返回类型:

FilteredSortedDynamicItemDataset

注意

临时更改输出键!

overfit_test(sample_count, total_count)[source]

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

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

  • total_count (int) – 总数据数量

返回:

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

返回类型:

FilteredSortedDynamicItemDataset

batch_shuffle(batch_size)[source]

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

参数:

batch_size (int) – 批次大小

返回:

dataset – 打乱后的数据集

返回类型:

FilteredSortedDynamicItemDataset

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

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

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

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

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]

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

参数:
  • overfit_test (bool) – 为 True 时执行过拟合测试

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

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

  • dataset (DynamicItemDataset) – 数据集

返回:

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

返回类型:

DynamicItemDataset