speechbrain.dataio.dataset 模块
用于加载单个数据点的数据集示例
- 作者
Aku Rouhe 2020
Samuele Cornell 2020
摘要
类
读取、处理和生成字典的数据集。 |
|
可能是过滤的,可能是排序的 DynamicItemDataset。 |
函数
用于向多个数据集添加相同项的辅助函数。 |
|
根据超参数文件中的配置,将过拟合测试应用于指定的数据集 |
|
用于向多个数据集设置相同项的辅助函数。 |
参考
- 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) – 此项提供的唯一键或多个键。
- 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 用于调试。
- 返回:
共享静态数据,但有自己的输出键和动态项(最初从这个数据集进行深拷贝,因此它们具有相同的可用动态项)
- 返回类型:
注意
临时更改输出键!
- overfit_test(sample_count, total_count)[source]
为过拟合测试创建此数据集的一个子集 - 重复 sample_count 个样本以创建总共有 epoch_data_count 个样本的重复数据集
- 参数:
- 返回:
dataset – 包含重复子集的数据集
- 返回类型:
- batch_shuffle(batch_size)[source]
在数据集中打乱批次。这与按长度排序结合使用特别有用 - 确保批次内的长度变化不高,但批次本身保持随机化
- 参数:
batch_size (int) – 批次大小
- 返回:
dataset – 打乱后的数据集
- 返回类型:
- classmethod from_json(json_path, replacements={}, dynamic_items=[], output_keys=[])[source]
加载数据准备 JSON 文件并基于它创建一个 Dataset。
- class speechbrain.dataio.dataset.FilteredSortedDynamicItemDataset(from_dataset, data_ids)[source]
-
可能是过滤的,可能是排序的 DynamicItemDataset。
共享静态数据(引用)。有自己的 dynamic_items 和 output_keys(深拷贝)。
- speechbrain.dataio.dataset.add_dynamic_item(datasets, func, takes=None, provides=None)[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 – 应用了过拟合测试的数据集
- 返回类型: