0

我对 allennlp 很陌生,我正在努力构建一个似乎不完全适合在 allennlp 中构建模型的标准方式的模型。

我想使用 NLP 构建管道模型。管道基本上由两个模型组成,我们称它们为 A 和 B。首先 A 被训练并基于完整训练 A 的预测,然后训练 B。

我所看到的是人们定义了两个独立的模型,使用命令行界面allennlp train ...在一个看起来像

# set a bunch of environment variables
...
allennlp train -s $OUTPUT_BASE_PATH_A --include-package MyModel --force $CONFIG_MODEL_A

# prepare environment variables for model b
...
allennlp train -s $OUTPUT_BASE_PATH_B --include-package MyModel --force $CONFIG_MODEL_B

我对此有两个担忧:

  1. 这段代码很难调试
  2. 它不是很灵活。当我想对完全训练的模型进行前向传递时,我编写了另一个脚本来执行该操作的 bash 脚本。

关于如何以更好的方式做到这一点的任何想法?

我考虑过使用 python 脚本而不是 shell 脚本并allennlp.commands.main(..)直接调用。这样做至少你有一个可以使用调试器运行的联合 python 模块。

4

1 回答 1

0

有两种可能性。

如果您真的只是将一个模型的输出插入另一个模型的输入,您可以将它们合并到一个模型中并以这种方式运行。如果您使用一个from_file模型用两个经过训练的模型初始化组合模型,则可以对两个已经训练好的模型执行此操作。在训练时做到这一点有点困难,但并非不可能。你会像现在一样训练第一个模型。对于第二步,您直接训练组合模型,冻结内部第一个模型的权重。

您可以做的另一件事是将 AllenNLP 用作库,而无需配置文件。我们在 GitHub 上有一个模板,向您展示了如何执行此操作。基本见解是,您在其中一个 Jsonnet 配置文件中配置的所有内容都与您可以直接从 Python 使用的 Python 类 1:1 对应。不需要使用配置文件。如果您以这种方式使用 AllenNLP,则具有更大的灵活性,包括将事物链接在一起。

于 2021-01-16T02:36:19.637 回答