如何从检查点加载图层

How to load a layer from checkpoint

我有这个配置:

network = {"source_embed_raw": {"class": "linear", ...}}

我想从一些现有检查点加载层 source_embed_raw 的参数。 在该检查点中,param 的调用方式不同 (output/rec/target_embed_raw/W).

我明白,我可以用 preload_from_files 加载参数,但我不确定在我的情况下具体的方法,因为层的名称不同,因此只需添加一个前缀就可以了不做作业。

目前preload_from_files无法以这种方式实现。 所以我目前看到这些可能的选项:

  1. 我们可以扩展 preload_from_files(和 CustomCheckpointLoader)的逻辑以允许这样的事情(一些通用的 variable/layer 名称映射)。

  2. 或者您可以将图层从 source_embed_raw 重命名为例如old_model__target_embed_raw 然后使用 preload_from_filesprefix 选项。如果你不想重命名它,你仍然可以添加一个像old_model__target_embed_raw这样的层,然后在source_embed_raw.

    中使用参数共享

    如果检查点中的参数实际上被称为 output/rec/target_embed_raw/...,您可以创建一个名为 old_model__outputSubnetworkLayer,因为另一个 SubnetworkLayer 名称为 rec,并在该层中命名为 target_embed_raw.

  3. 您可以编写一个脚本来简单地加载现有的检查点,并将存储作为一个新的检查点,但具有重命名的变量名(这也完全独立于 RETURNN)。

  4. LinearLayer(以及大多数其他层)允许准确指定参数的初始化方式(forward_weights_initbias_init)。参数初始化非常灵活。例如。有像load_txt_file_initializer这样的东西可以用。目前没有这样的功能可以直接从现有检查点加载它,但我们可以添加它。或者你可以简单地在你的配置中实现逻辑(它只会是 5 行左右的代码)。

  5. 除了使用 preload_from_files,您还可以使用 SubnetworkLayerload_on_init 选项。然后是与选项 2 类似的逻辑。