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

问题描述

我的模型中有多个深度神经网络,并希望它们具有相同的输入大小 (网络属于不同的类别)。比如我的模型是:

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。但是,我希望每个 Net 的 hparams-configs 完整,以便以后我只能使用 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',128]}