【发布时间】:2020-10-24 07:55:11
【问题描述】:
我正在探索 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 = 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 是一个包含 Normalizer 参数的 dict,例如 so{"_target_": ...},而不是一个初始化的 Normalizer 类。如何避免在标记器配置中显式重复规范器的定义?
【问题讨论】:
-
如果您展示您的实际最终配置以及现在您如何编写它,这将有所帮助。
-
您好,谢谢您的回复。上面的配置基本上是我使用的。我使用基本教程中提到的默认主装饰器来编写配置。也许问题更像是如何在另一个组配置中使用组配置选项以及在这种情况下如何使用递归实例化。一旦我拿到我的电脑,我会重新制定
-
@omry 我编辑了这个问题以使其更有意义。有一些零件丢失了。现在还不能理解吗?
标签: fb-hydra hydra-python