有没有办法自动匹配多个相同的参数?

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]}