3

我正在使用嵌套参数,parameters.yml并希望使用kedro runCLI 命令的运行时参数覆盖这些参数:

train:
    batch_size: 32
    train_ratio: 0.9
    epochs: 5

以下似乎不起作用:

kedro run --params  train.batch_size:64,train.epochs:50 

epoch 和 batch_size 的值来自parameters.yml. 如何使用 cli 命令覆盖这些参数?

4

2 回答 2

3

附加参数通过in传递给KedroContext对象。在这里,您可以看到有一个回调(受保护)函数调用,它将键值对拆分为.load_context(Path.cwd(), env=env, extra_params=params)kedro_cli.py_split_params:

_split_params首先将字符串拆分为逗号(以获取多个参数),然后拆分为冒号。实际上添加一个打印/日志记录的语句extra_params将向您显示如下内容:

{'train.batch_size': 64, 'train.epochs': 50}

我认为你有几个选择:

  1. 取消嵌套参数。这样你就可以正确地覆盖它们。
  2. 将自定义逻辑添加到_split_paramsinkedro_cli.py以在字符上创建嵌套字典,该字典.将传递到上述 func 中。我认为你可以重用很多现有的逻辑。

注意:这是在kedro==0.16.2.

NB2:kedro拆分嵌套参数_get_feed_dict的方式是_add_param_to_feed_dict使用context.py. 具体来说,_add_param_to_feed_dict是一个递归函数,它解包字典并格式化为"{}.{}".format(key, value). IMO 你可以使用这里的逻辑。

于 2020-08-04T08:55:53.283 回答
0

我会建议另一种方式。我添加到我的 Kedro 项目文件run.py并覆盖KedroContextConfigLoader.

现在我可以在 CLI 中使用类似的东西,kedro run .. --params "train_kwargs_max_epochs:1"它将被转换为train_kwargs.max_epochs = 1.

所以我可以在我的管道params:train_kwargs和节点中使用它来初始化 Trainer: Trainer(**train_kwargs)

如果有人对此感兴趣,我很乐意提供完整的源代码。问题是当前代码与我客户的源代码深度集成,我需要时间来分离和发布。

于 2020-11-09T12:50:33.533 回答