如何解决Hydra 默认列表中的插值原因和错误
这是文件目录:
|-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)
Config
和 DatasetConfig
是这样定义的:
@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
时,它工作正常并执行运行时检查。但是,使用 ${}
进行插值不会。那是什么,我能做什么?
解决方法
无法使用默认列表中的插值来引用主配置中的键。
来自 Interpolation in the Defaults List 上的 Hydra 文档:
默认列表中的插值键不能引用最终配置对象中的值(目前还没有)。
特别是,重要的是要了解在构建 Hydra 的输出配置之前完全构建了默认列表。由于解析的默认值列表将用于指导输出配置的构建,因此有必要先处理默认值,然后再开始构建输出配置。
由于必须在构建输出配置之前解析默认列表中的插值,因此无法插值到输出配置中的值。
另一方面,可以使用插值来引用默认列表中中的其他值。例如,您可以尝试以下操作:
# example.yaml
defaults:
- data: csv_images
- data_conf: "${data}"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。