如何从Hydra实例化后的类对象中获取对应的原始配置结构体
解决方案
有两种常用的可落地实现方案:
方案1:关闭递归实例化,类内部手动完成内层实例化
这是最推荐的实现方式,你只需要在外层类的配置中增加_recursive_: false参数,Hydra实例化ClassA时就不会自动递归实例化内层的配置节点,此时构造函数拿到的model参数就是原始的OmegaConf配置结构体,你可以在类内部手动调用实例化接口,同时持有原始配置和实例对象。
配置示例:
_target_: ClassA _recursive_: false # 关闭当前层级的递归实例化 foo: bar model: _target_: ClassB hello: world
对应的ClassA代码示例:
from hydra.utils import instantiate from omegaconf import DictConfig class ClassA: def __init__(self, foo: str, model: DictConfig): self.foo = foo # 保存ClassB的原始配置 self.model_config = model # 手动实例化得到ClassB对象 self.model = instantiate(model)
如果需要输出yaml格式的配置,调用OmegaConf.to_yaml(self.model_config)即可得到你期望的配置内容。
方案2:配置插值传递原始配置段,作为独立参数传入
如果你不想修改ClassA的内部实例化逻辑,可以用OmegaConf的插值语法,把model配置节点作为独立参数传递给ClassA,不需要改动原有实例化逻辑。
配置示例:
_target_: ClassA foo: bar model: _target_: ClassB hello: world # 插值引用同层级的model配置节点,作为独立参数传入 model_config: ${.model}
对应的ClassA代码示例:
from omegaconf import DictConfig class ClassA: def __init__(self, foo: str, model: ClassB, model_config: DictConfig): self.foo = foo self.model = model self.model_config = model_config
内容的提问来源于stack exchange,提问作者Nils Werner
相关产品推荐
相关产品推荐

