递归初始化以及如何在另一个配置组中使用配置组

问题描述

我正在探索hydra中递归初始化的选项。我能够基于this PR设置一个有效的示例。当尝试更高级的东西时,我偶然发现了以下问题。我的目录结构如下:

config/
  config.yaml
    /tokenizer
      Tokenizer.yaml
    /normalizer
      normalizer.yaml

配置包含:

<config.yaml>
default:
  - tokenizer: Tokenizer

<Tokenizer.yaml>
_target_: some.path.Tokenizer
normalizer: normalizer # I want this to be the normalizer object after instantiation,but getting string. 

<normalizer.yaml>
_target_: some.other.path.normalizer
arg1: value1

我想递归地实例化Tokenizer,而无需显式编写normalizer的所有参数,因为在normalizer.yaml文件中已经提到了所有参数。换句话说,我想在tokenizer配置组中使用normalizer配置组。现在,如果我调用tokenizer = instantiate(cfg.tokenizer),则结果是Tokenizer类对象,但是tokenizer.normalizer是字符串normalizer。如果我使用值插值并按如下所示设置项目:

<config.yaml>
default:
  - tokenizer: Tokenizer
  - normalizer: normalizer

<Tokenizer.yaml>
_target_: some.path.Tokenizer
normalizer: ${normalizer} 

<normalizer.yaml>
_target_: some.other.path.normalizer
arg1: value1

结果变量tokenizer.normalizer一个字典,它像这样{"_target_": ...}包含normalizer的args,而不是初始化的normalizer类。如何避免需要在令牌化程序配置中明确重复标准化器的定义?

解决方法

我不认为您想要的现在得到支持。 请以最少的配置提交功能请求,并说明当前行为和所需行为。