有没有办法自动匹配多个相同的参数?
Is there a way to auto-match multiple parameters the same?
我的模型中有多个深度神经网络,并希望它们具有相同的输入大小
(网络不同 类)。比如我的模型是:
class Model:
def __init__(self, cfg: DictConfig):
self.net1 = Net1(**cfg.net1_hparams)
self.net2 = Net2(**cfg.net2_hparams)
这里Net1和Net2有不同的超参数组,但是其中input_size
参数是Net1和Net2共享的,必须匹配,即cfg.net1_hparams.input_size == cfg.net2_hparams.input_size
.
我可以在父级别定义 input_size:cfg.input_size
并手动将它们传递给 Net1 和 Net2。但是,我希望每个网络的 hparams-configs 都是 complete 这样以后我就可以只使用 cfg.net1_hparams
.
构建 Net1
有没有在 hydra 中实现这个的好方法?
这可以使用 OmegaConf 的 variable interpolation 功能来实现。
这是一个使用 Hydra 变量插值来实现预期结果的最小示例:
# config.yaml
shared_hparams:
input_size: [128, 128]
net1_hparams:
name: net one
input_size: ${shared_hparams.input_size}
net2_hparams:
name: net two
input_size: ${shared_hparams.input_size}
"""my_app.py"""
import hydra
from omegaconf import DictConfig
class Model:
def __init__(self, cfg: DictConfig):
print("Net1", dict(**cfg.net1_hparams))
print("Net2", dict(**cfg.net2_hparams))
@hydra.main(config_name="config")
def my_app(cfg: DictConfig) -> None:
Model(cfg)
if __name__ == "__main__":
my_app()
运行 my_app.py
在命令行产生这个结果:
$ python my_app.py
Net1 {'name': 'net one', 'input_size': [128, 128]}
Net2 {'name': 'net two', 'input_size': [128, 128]}
我的模型中有多个深度神经网络,并希望它们具有相同的输入大小 (网络不同 类)。比如我的模型是:
class Model:
def __init__(self, cfg: DictConfig):
self.net1 = Net1(**cfg.net1_hparams)
self.net2 = Net2(**cfg.net2_hparams)
这里Net1和Net2有不同的超参数组,但是其中input_size
参数是Net1和Net2共享的,必须匹配,即cfg.net1_hparams.input_size == cfg.net2_hparams.input_size
.
我可以在父级别定义 input_size:cfg.input_size
并手动将它们传递给 Net1 和 Net2。但是,我希望每个网络的 hparams-configs 都是 complete 这样以后我就可以只使用 cfg.net1_hparams
.
有没有在 hydra 中实现这个的好方法?
这可以使用 OmegaConf 的 variable interpolation 功能来实现。
这是一个使用 Hydra 变量插值来实现预期结果的最小示例:
# config.yaml
shared_hparams:
input_size: [128, 128]
net1_hparams:
name: net one
input_size: ${shared_hparams.input_size}
net2_hparams:
name: net two
input_size: ${shared_hparams.input_size}
"""my_app.py"""
import hydra
from omegaconf import DictConfig
class Model:
def __init__(self, cfg: DictConfig):
print("Net1", dict(**cfg.net1_hparams))
print("Net2", dict(**cfg.net2_hparams))
@hydra.main(config_name="config")
def my_app(cfg: DictConfig) -> None:
Model(cfg)
if __name__ == "__main__":
my_app()
运行 my_app.py
在命令行产生这个结果:
$ python my_app.py
Net1 {'name': 'net one', 'input_size': [128, 128]}
Net2 {'name': 'net two', 'input_size': [128, 128]}