使用文件而不是 Hydra 配置中的变量进行专门配置

问题描述

我想根据 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,line 694,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 用于新的默认列表。您可以将此版本安装为预发布版本(请参阅主要项目自述文件)。