如果您已经遵循深度学习中的一些最佳实践,那么Facebook 的 Hydra可能是您熟悉的名字。通过Hydra 文档,我遇到了两个重要的运算符+和++。文件中提到了这些运算符的使用,如下所示:
Appending a config value : +foo.bar=value
Appending or overriding a config value : ++foo.bar=value
我需要一些帮助来理解这些运算符,因为从技术上讲,在代码中使用它们对整体输出没有影响。
如果您已经遵循深度学习中的一些最佳实践,那么Facebook 的 Hydra可能是您熟悉的名字。通过Hydra 文档,我遇到了两个重要的运算符+和++。文件中提到了这些运算符的使用,如下所示:
Appending a config value : +foo.bar=value
Appending or overriding a config value : ++foo.bar=value
我需要一些帮助来理解这些运算符,因为从技术上讲,在代码中使用它们对整体输出没有影响。
假设我们有以下简单的 hydra 应用程序:
├── config.yaml
└── my_app.py
# my_app.py
import hydra
from omegaconf import OmegaConf, DictConfig
@hydra.main(".", "config")
def app(cfg: DictConfig):
print(OmegaConf.to_yaml(cfg))
if __name__ == "__main__":
app()
# config.yaml
a:
b: c
$ python my_app.py
a:
b: c
让我们看一下您链接的文档页面中“修改配置对象”的四种方法:
foo.bar=value+foo.bar=value++foo.bar=value~foo.bar,~foo.bar=value$ python my_app.py a.b=y
a:
b: y
$ python my_app.py a.x=y
Could not override 'a.x'.
To append to your config use +a.x=y
Key 'x' is not in struct
full_key: a.x
object_type=dict
$ python my_app.py +a.b=y
Could not append to config. An item is already at 'a.b'.
Either remove + prefix: 'a.b=y'
Or add a second + to add or override 'a.b': '++a.b=y'
...
$ python my_app.py +a.x=y
a:
b: c
x: y
$ python my_app.py ++a.b=y
a:
b: y
$ python my_app.py ++a.x=y
a:
b: c
x: y
$ python my_app.py ~a.b
a: {}
$ python my_app.py ~a.b=c
a: {}
$ python my_app.py ~a.b=y
Could not delete from config. The value of 'a.b' is c and not y.
...
$ python my_app.py ~a.x
Could not delete from config. 'a.x' does not exist.
...
$ python my_app.py ~a.x=y
Could not delete from config. 'a.x' does not exist.
总结一下:
foo.bar=value仅当给定键已存在于配置中时,覆盖配置值 ( ) 才有效+foo.bar=value仅当给定键尚未出现在配置中时,附加配置值 ( ) 才有效++foo.bar=value无论该键是否存在于配置中,附加或覆盖配置值 ( ) 都有效~foo.bar, ) 才有效。~foo.bar=value