hyperpyyaml.core 模块
该库收集了用于加载 hyperpyyaml 的实用工具
- 作者
Peter Plantinga 2020
Aku Rouhe 2020
Jianchen Li 2022
摘要
类
用于将 !PLACEHOLDER 标签转储到 yaml 的类 |
|
用于将 !ref 标签转储到 yaml 的类 |
函数
查找点表示法中引用所指向的值 |
|
转储包含占位符和引用标签的 yaml。 |
|
此函数实现了 HyperPyYAML 语法 |
|
解析引用中的简单算术操作 |
|
解析引用以获取值,遵循引用链 |
|
类似于 |
|
解析文档间引用,这是 HyperPyYAML 的一个组成部分。 |
参考
- hyperpyyaml.core.load_hyperpyyaml(yaml_stream, overrides=None, overrides_must_match=True, loader=<class 'ruamel.yaml.loader.Loader'>)[source]
此函数实现了 HyperPyYAML 语法
此语法旨在实现紧凑、结构化的超参数和函数定义。此函数实现了对 yaml 语法的一些扩展,如下所示。
PyYAML 复杂标签快捷方式
我们清晰结构化超参数接口的一部分是能够轻松干净地指定 python 对象。使用原生 YAML 通过以下语法可以实现这一点
alignment_saver: !!python/object/new:speechbrain.data_io.TensorSaver kwargs: {save_dir: results/asr/ali}
然而,由于在 speechbrain yaml 文件中的广泛使用,我们为此添加了一个快捷方式,其语法如下
alignment_saver: !new:speechbrain.data_io.TensorSaver save_dir: results/asr/ali
在此示例中,alignment_saver 将是
TensorSaver
类的一个实例,其中'exp/asr/ali'
作为关键字参数传递给__init__()
方法。这等同于import speechbrain.data_io.data_io alignment_saver = speechbrain.data_io.TensorSaver( save_dir='exp/asr/ali' )
我们还实现了一些其他快捷方式:
!!python/name: => !name: !!python/module: => !module: !!python/object/apply: => !apply:
引用和复制
允许对文件中的任何节点进行内部引用。任何带有
!ref
标签的节点都将创建对 yaml 中<key.subkey>
位置的 yaml 对象的对象引用,并遵循引用链。output_folder: results/asr alignment_saver: !new:speechbrain.data_io.TensorSaver save_dir: !ref <output_folder>
字符串值被特殊处理:引用会被替换,但字符串的其余部分会保留,以便轻松扩展文件路径
output_folder: results/asr alignment_saver: !new:speechbrain.data_io.TensorSaver save_dir: !ref <output_folder>/ali # results/asr/ali
一个更复杂的示例,用于演示
key1: {a: !new:object {arg1: 1}} key2: !ref <key1[a]>
在这里,
key2
将包含对a
对象的引用,因此更改a.arg1
也会更改key2.arg1
。如果您需要对象的深层复制而不是浅层引用,可以使用带有!copy
标签的类似语法。例如key1: {a: !new:object {arg1: 1}} key2: !copy <key1[a]>
这些还将实现非常基本的算术,所以
key1: 1 key2: !ref <key1> + 3 # this is 4
元组
最后一个小改进是隐式元组解析器。传递字符串值
(3, 4)
将被赋予!tuple
标签,然后被解释为元组。- 参数:
yaml_stream (stream) – 用于读取的文件类对象或字符串。
overrides (mapping 或 str) – 用于覆盖从流中读取的值的集合。由于 yaml 实现了嵌套结构,覆盖也一样。参见
speechbrain.utils.data_utils.recursive_update
overrides_must_match (bool) – 当覆盖项与 yaml_stream 中的对应键不匹配时是否抛出错误。
return_dict (bool) – 是否返回字典而不是默认命名空间。
loader (Loader) – 用于解析 yaml_stream,可以是
ruamel.yaml.Loader
,yaml.Loader
等。
- 返回:
hparams – 反映
yaml_stream
的结构。- 返回类型:
示例
>>> yaml_string = """ ... a: 3 ... thing: !new:collections.Counter ... b: !ref <a> ... """ >>> params = load_hyperpyyaml(yaml_string) >>> params["thing"] Counter({'b': 3})
- class hyperpyyaml.core.RefTag(ref_str)[source]
基类:
object
用于将 !ref 标签转储到 yaml 的类
- 参数:
ref_str (str) – 包含以
<key>
表示法表示的 yaml 键的字符串
示例
参见
dump_hyperpyyaml
- yaml_tag = '!ref'
- class hyperpyyaml.core.Placeholder[source]
基类:
object
用于将 !PLACEHOLDER 标签转储到 yaml 的类
示例
参见
dump_hyperpyyaml
- yaml_tag = '!PLACEHOLDER'
- hyperpyyaml.core.dump_hyperpyyaml(yaml_tree, output_stream, *args, **kwargs)[source]
转储包含占位符和引用标签的 yaml。
- 参数:
yaml_tree (dict) – 要转储的对象
output_stream (stream) – 用于放置 yaml 的文件流
*args – 传递给 ruamel.yaml.YAML().dump() 的参数
**kwargs – 传递给 ruamel.yaml.YAML().dump() 的参数
示例
>>> to_yaml = {'a': Placeholder(), 'b': RefTag('<a>')} >>> stringio = StringIO() >>> dump_hyperpyyaml(to_yaml, stringio) >>> stringio.getvalue() 'a: !PLACEHOLDER\nb: !ref <a>\n'
- hyperpyyaml.core.resolve_references(yaml_stream, overrides=None, overrides_must_match=False)[source]
解析文档间引用,这是 HyperPyYAML 的一个组成部分。
- 参数:
- 返回:
一个解析了所有引用和覆盖项的 yaml 格式流。
- 返回类型:
stream
示例
>>> yaml_string = """ ... constants: ... a: 3 ... b: !ref <constants[a]> ... """ >>> overrides = {'constants': {'a': 4}} >>> resolve_references(yaml_string, overrides).getvalue() 'constants:\n a: 4\n b: 4\n'
- hyperpyyaml.core.deref(ref, full_tree, copy_mode=False)[source]
查找点表示法中引用所指向的值
- 参数:
- 返回:
full_tree 字典中由
ref
引用的节点。- 返回类型:
节点
示例
>>> deref('constants[a][b]', {'constants': {'a': {'b': 'c'}}}) 'c'
- hyperpyyaml.core.recursive_resolve(reference, reference_list, full_tree, copy_mode=False)[source]
解析引用以获取值,遵循引用链
- 参数:
- 返回:
解除引用的值,可能包含字符串插值和算术解析。
- 返回类型:
标量
示例
>>> tree = {'a': 3, 'b': 'x', 'c': '<a>', 'd': '<c>/<c>', 'e': '<b>/<b>'} >>> recursive_resolve('<d>', [], tree) 1.0 >>> recursive_resolve('<e>', [], tree) 'x/x'
- hyperpyyaml.core.parse_arithmetic(reference_string)[source]
解析引用中的简单算术操作
改编自 https://stackoverflow.com/a/9558001/1761970
示例
>>> parse_arithmetic('2 * 6') 12
- hyperpyyaml.core.recursive_update(d, u, must_match=False)[source]
类似于
dict.update
的函数,但用于嵌套的dict
。来源:https://stackoverflow.com/a/3233356
如果您有一个嵌套映射结构,例如
{“a”: 1, “b”: {“c”: 2}}
假设您想用以下内容更新上述结构
{“b”: {“d”: 3}}
此函数将生成
{“a”: 1, “b”: {“c”: 2, “d”: 3}}
而不是
{“a”: 1, “b”: {“d”: 3}}
示例
>>> d = {'a': 1, 'b': {'c': 2}} >>> recursive_update(d, {'b': {'d': 3}}) >>> d {'a': 1, 'b': {'c': 2, 'd': 3}}