在 Hydra 配置中使用文件而不是变量专门配置
specializing configuration with files instead of variables in Hydra config
我想根据 Hydra 文档在通用模式 -> 专业化配置中使用专业化配置。不同的是,我的专门配置在一个文件中,而不仅仅是一个变量。在下面的示例中,我想选择基于模型和数据集的转换。不同转换的配置在文件中。如果我在 dataset_model/cifar10_alexnet.yaml 文件中指定所有转换配置,这将起作用,但这会破坏目的,因为在这种情况下我不能重用转换配置。在 Hydra 的其他地方,如果您指定文件的名称,它会自动选择该文件中的配置,但它似乎在专门的配置中不起作用。
我已将文档中的示例修改如下:
config.yaml:
defaults:
- dataset: cifar10
- model: alexnet
- transform: crop
- dataset_model: ${defaults.0.dataset}_${defaults.1.model}
optional: true
添加了名为 transform 的目录和该目录中的两个文件:
crop.yaml:
# @package _group_
type: crop
test1: 7
resize.yaml:
# @package _group_
type: resize
test1: 50
更改文件 dataset_model/cifar10_alexnet.yaml:
# @package _global_
model:
num_layers: 5
transform: resize
其他一切都与文档完全一致。当我 运行 这个我得到一个例外:
Traceback (most recent call last):
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/hydra/_internal/config_loader_impl.py", line 720, in _merge_config
ret = OmegaConf.merge(cfg, loaded_cfg)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/omegaconf.py", line 321, in merge
target.merge_with(*others[1:])
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/basecontainer.py", line 331, in merge_with
self._format_and_raise(key=None, value=None, cause=e)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/base.py", line 101, in _format_and_raise
type_override=type_override,
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/_utils.py", line 629, in format_and_raise
_raise(ex, cause)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/_utils.py", line 610, in _raise
raise ex # set end OC_CAUSE=1 for full backtrace
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/basecontainer.py", line 329, in merge_with
self._merge_with(*others)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/basecontainer.py", line 347, in _merge_with
BaseContainer._map_merge(self, other)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/basecontainer.py", line 296, in _map_merge
dest.__setitem__(key, src_value)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/dictconfig.py", line 262, in __setitem__
self._format_and_raise(key=key, value=value, cause=e)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/base.py", line 101, in _format_and_raise
type_override=type_override,
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/_utils.py", line 694, in format_and_raise
_raise(ex, cause)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/_utils.py", line 610, in _raise
raise ex # set end OC_CAUSE=1 for full backtrace
omegaconf.errors.ValidationError:
full_key: transform
reference_type=Optional[Dict[Union[str, Enum], Any]]
object_type=dict
所以,问题是 - 这个功能是否受支持,如果是,我做错了什么?
您的配置正在尝试将字符串“resize”合并到字典中,例如:
transform:
type: crop
test1: 7
这不是你能做到的。
你并没有很好地解释你想要做什么,但我的猜测是你想根据所选数据集编写不同的转换。
Hydra 1.1 将添加对递归默认列表的支持,这可能允许您做您想做的事。
This is the doc 用于新的默认列表。您可以将此版本安装为预发布版本(请参阅主要项目自述文件)。
我想根据 Hydra 文档在通用模式 -> 专业化配置中使用专业化配置。不同的是,我的专门配置在一个文件中,而不仅仅是一个变量。在下面的示例中,我想选择基于模型和数据集的转换。不同转换的配置在文件中。如果我在 dataset_model/cifar10_alexnet.yaml 文件中指定所有转换配置,这将起作用,但这会破坏目的,因为在这种情况下我不能重用转换配置。在 Hydra 的其他地方,如果您指定文件的名称,它会自动选择该文件中的配置,但它似乎在专门的配置中不起作用。
我已将文档中的示例修改如下:
config.yaml:
defaults:
- dataset: cifar10
- model: alexnet
- transform: crop
- dataset_model: ${defaults.0.dataset}_${defaults.1.model}
optional: true
添加了名为 transform 的目录和该目录中的两个文件:
crop.yaml:
# @package _group_
type: crop
test1: 7
resize.yaml:
# @package _group_
type: resize
test1: 50
更改文件 dataset_model/cifar10_alexnet.yaml:
# @package _global_
model:
num_layers: 5
transform: resize
其他一切都与文档完全一致。当我 运行 这个我得到一个例外:
Traceback (most recent call last):
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/hydra/_internal/config_loader_impl.py", line 720, in _merge_config
ret = OmegaConf.merge(cfg, loaded_cfg)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/omegaconf.py", line 321, in merge
target.merge_with(*others[1:])
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/basecontainer.py", line 331, in merge_with
self._format_and_raise(key=None, value=None, cause=e)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/base.py", line 101, in _format_and_raise
type_override=type_override,
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/_utils.py", line 629, in format_and_raise
_raise(ex, cause)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/_utils.py", line 610, in _raise
raise ex # set end OC_CAUSE=1 for full backtrace
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/basecontainer.py", line 329, in merge_with
self._merge_with(*others)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/basecontainer.py", line 347, in _merge_with
BaseContainer._map_merge(self, other)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/basecontainer.py", line 296, in _map_merge
dest.__setitem__(key, src_value)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/dictconfig.py", line 262, in __setitem__
self._format_and_raise(key=key, value=value, cause=e)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/base.py", line 101, in _format_and_raise
type_override=type_override,
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/_utils.py", line 694, in format_and_raise
_raise(ex, cause)
File "/home/natalia/.pyenv/versions/3.7.9/lib/python3.7/site-packages/omegaconf/_utils.py", line 610, in _raise
raise ex # set end OC_CAUSE=1 for full backtrace
omegaconf.errors.ValidationError:
full_key: transform
reference_type=Optional[Dict[Union[str, Enum], Any]]
object_type=dict
所以,问题是 - 这个功能是否受支持,如果是,我做错了什么?
您的配置正在尝试将字符串“resize”合并到字典中,例如:
transform:
type: crop
test1: 7
这不是你能做到的。
你并没有很好地解释你想要做什么,但我的猜测是你想根据所选数据集编写不同的转换。
Hydra 1.1 将添加对递归默认列表的支持,这可能允许您做您想做的事。
This is the doc 用于新的默认列表。您可以将此版本安装为预发布版本(请参阅主要项目自述文件)。