speechbrain.dataio.dataset 模块
加载单个数据点的数据集示例
- Authors
阿库·柔赫 2020
萨穆埃莱·科内尔 2020
摘要
类:
读取、处理并生成字典的数据集。 |
|
可能是过滤的,可能是排序的 DynamicItemDataset。 |
函数:
用于将相同项目添加到多个数据集的辅助工具。 |
|
对指定的数据集应用过拟合测试,如超参数文件中配置的那样 |
|
用于将相同项目设置到多个数据集的辅助工具。 |
参考
- 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) – 此提供的唯一键或键。
- 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:
注意
暂时更改输出键!
- overfit_test(sample_count, total_count)[source]
创建此数据集的子集用于过拟合测试 - 重复 sample_count 样本以创建一个包含总共 epoch_data_count 样本的重复数据集
- Parameters:
- Returns:
dataset – 一个包含重复子集的数据集
- Return type:
- batch_shuffle(batch_size)[source]
在数据集中打乱批次。这在结合长度排序时特别有用 - 确保批次内的长度变化不大,但批次本身保持随机化。
- Parameters:
batch_size (int) – 批量大小
- Returns:
dataset – 一个经过打乱的数据集
- Return type:
- classmethod from_json(json_path, replacements={}, dynamic_items=[], output_keys=[])[source]
加载一个数据准备JSON文件并基于它创建一个数据集。
- class speechbrain.dataio.dataset.FilteredSortedDynamicItemDataset(from_dataset, data_ids)[source]
基础类:
DynamicItemDataset可能是经过过滤或排序的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]
将过拟合测试应用于指定的数据集,如超参数文件中配置的那样
- Parameters:
overfit_test (bool) – 当为True时,执行过拟合测试
overfit_test_sample_count (int) – 过拟合测试的样本数量
overfit_test_epoch_data_count (int) – 过拟合测试的epoch数量
数据集 (DynamicItemDataset) – 数据集
- Returns:
dataset – 数据集,应用了过拟合测试
- Return type: