【问题标题】:specializing configuration with files instead of variables in Hydra config使用文件而不是 Hydra 配置中的变量专门配置
【发布时间】:2021-02-22 17:44:05
【问题描述】:

我想根据 Hydra 文档在 Common Patterns -> Specializing Configuration 中使用专门的配置。不同之处在于我的专门配置在一个文件中,而不仅仅是一个变量。在下面的示例中,我想根据模型和数据集选择转换。不同转换的配置在文件中。如果我在 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

调整大小.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

所以,问题是 - 是否支持此功能,如果支持,我做错了什么?

【问题讨论】:

    标签: fb-hydra hydra-python


    【解决方案1】:

    您的配置正在尝试将字符串“resize”合并到一个字典中,例如:

    transform:
      type: crop
      test1: 7
    

    这不是你能做的。

    您并没有很好地解释您要做什么,但我的猜测是您想根据所选数据集组合不同的转换。

    Hydra 1.1 将添加对递归默认列表的支持,这可能允许您做您想做的事情。

    This is the doc 用于新的默认列表。您可以将此版本安装为预发布版本(请参阅主要项目自述文件)。

    【讨论】:

    • 对问题添加了更多解释。我想做的很简单——根据模型和数据集选择转换。不同的转换配置位于单独的文件中。您支持指定文件名的其他任何地方,但看起来专用配置不支持它。我浏览了您的文档以获取默认列表,但我看不出它与此用例有何关系。您能否解释一下如何为此使用递归默认列表?
    • 你能再给我看一个我支持指定文件名的例子吗?配置名称只能在默认列表中指定。
    • 我认为您对 Hydra 的工作原理有些误解。我建议您在尝试使用默认列表中的插值等功能(“Specialized configs”)之前先阅读基本教程以更好地理解事物
    • 我看了看,即使在 Hydra 1.1 中,您所追求的也没有得到令人满意的支持。您有一个误解,使您认为在配置中指定配置名称“在任何地方都受支持”,而实际上在任何地方都不支持。在 1.1 中可以实现一些合理的东西,但它不是很优雅。
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多