我正在通过这个 Hydra 文档示例 使用实验配置覆盖主配置。与 Hydra 示例不同,我有另一级文件夹层次结构,用于将所有关联的配置收集到单个子文件夹中。
conf
├── data
│ ├── cifar100_data
│ │ ├── cifar100_extended.yaml
│ │ └── cifar100.yaml
│ └── default.yaml
├── experiment
│ └── cifar100.yaml
└── training_config.yaml
在我的示例中,我有一个基本的
training_config
:
defaults:
- data: default
data/default.yaml
:
# @package data
dataset: mnist
n_classes: 10
以及 cifar100 数据的两个配置文件
cifar100_data/cifar100.yaml
:
name: cifar100
n_classes: 100
cifar100_data/cifar100_extended.yaml
:
# @package data
defaults:
- cifar100
augmentations:
- rotate
我正在尝试用
training_config
覆盖 experiment/cifar100
--> python my_app.py experiment=cifar100
:
experiment/cifar100
尝试1:
# @package _global_
defaults:
- override /data/cifar100_data: cifar100_extended
错误信息:
Hydra.errors.ConfigCompositionException:在“实验/cifar100”中: 无法覆盖“data/cifar100_data”。默认情况下不匹配 列表。
experiment/cifar100
尝试2:
# @package _global_
defaults:
- override /data: cifar100_data/cifar100_extended
错误信息:
Hydra.errors.MissingConfigException:在 “data/cifar100_data/cifar100_extended”:无法加载 “数据/cifar100”。
与默认配置相比,如何使用额外的层次结构正确运行这样的实验?
这有点不寻常。您的数据配置组应该是
data
,而不是 /data/cifar100_data
,因此第二种形式是正确的:
# @package _global_
defaults:
- override /data: cifar100_data/cifar100_extended
您收到的错误是:
hydra.errors.MissingConfigException: In 'data/cifar100_data/cifar100_extended': Could not load 'data/cifar100'.
这告诉您,在尝试 data/cifar100_data/cifar100_extended 时,Hydra 尝试加载 data/cifar100 但找不到它。 事实上,该文件位于
data/cifar100_data/cifar100
而不是 data/cifar100
。
这看起来像一个错误,因为相对配置组条目应该相对于包含的配置,并且 cifa100 就在 cifar100_extended 旁边。
该错误与您不寻常地构建带有子目录的配置组有关,该配置组未得到正确支持(通常期望每个子目录都是其自己的配置组)。
解决方法是将
cifar100_extended.yaml
调整为:
# @package data
defaults:
- cifar100_data/cifar100
augmentations:
- rotate