【问题标题】:Interpolation in Hydra's defaults list cause and errorHydra 的默认值列表中的插值原因和错误
【发布时间】:2021-07-20 14:50:17
【问题描述】:

这是文件目录:

|-configs
|----data_conf
|--------csv_images.csv
|--------tf_ds.csv
|----example.yaml 

example.yaml 是:

data: csv_images

defaults:
  - data_conf: "${data}"

csv_images.yaml:

# @package _group_
a: test_a
b: test_b

我的意图是 hydra 将 csv_images 替换为 csv_images.yaml。意思是,example.yaml 在运行时的解释是:

data:
    a: test_a
    b: test_b

我这样定义了ConfigStore

config_name = "example"
cs = ConfigStore.instance()
cs.store(name=config_name, node=Config)
cs.store(group='data_conf', name='csv_images', node=DatasetConfig)

ConfigDatasetConfig 是这样定义的:

@dataclass
class Config:
    data: Any = MISSING

@dataclass
class DatasetConfig:
    a: str = MISSING
    b: str = MISSING

但是,当我运行我的程序时,我收到以下错误:

Interpolation key 'data' not found
    full_key: defaults[0].data_conf
    object_type=dict

Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.

当我将data_conf 定义为csv_images 时,它工作正常并执行运行时检查。但是,使用 ${} 进行插值不会。那是什么,我能做什么?

【问题讨论】:

    标签: python fb-hydra hydra-python omegaconf


    【解决方案1】:

    无法使用默认列表中的插值来引用主配置中的键。

    来自Interpolation in the Defaults List 上的 Hydra 文档:

    默认列表中的插值键无法引用最终配置对象中的值(目前还没有)。

    特别是,重要的是要了解默认列表是在构建 Hydra 的输出配置之前完全构建的。由于解析后的默认列表将用于指导输出配置的构建,因此有必要在开始构建输出配置之前先处理默认值。

    由于必须在构建输出配置之前解析默认列表中的插值,因此无法插值到输出配置中的值。

    另一方面,可以使用插值来引用默认列表的其他值。例如,您可以尝试以下方法:

    # example.yaml
    
    defaults:
      - data: csv_images
      - data_conf: "${data}"
    

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2013-05-08
      相关资源
      最近更新 更多