【问题标题】:How to load a finetuned sciBERT model in AllenNLP?如何在 AllenNLP 中加载微调的 sciBERT 模型?
【发布时间】:2021-02-28 00:54:09
【问题描述】:

我已经在 SciIE 数据集上微调了 SciBERT 模型。存储库使用 AllenNLP 来微调模型。训练执行如下:

python -m allennlp.run train $CONFIG_FILE  --include-package scibert -s "$@" 

成功训练后,我有一个 model.tar.gz 文件作为输出,其中包含 weights.th、config.json 和词汇文件夹。我试图将它加载到 allenlp 预测器中:

from allennlp.predictors.predictor import Predictor
predictor = Predictor.from_path("model.tar.gz")

但我收到以下错误:

ConfigurationError:bert-pretrained 不在可接受的选择中 dataset_reader.token_indexers.bert.type: ['single_id', 'characters', 'elmo_characters'、'spacy'、'pretrained_transformer'、 'pretrained_transformer_mismatched']。您应该使用 --include-package 标志以确保加载了正确的模块,或者在配置文件中使用完全限定的类名,例如 {"model": "my_module.models.MyModel"} 让它自动导入。

我从未使用过 allenNLP,所以我很迷茫。

作为参考,这是描述令牌索引器的配置部分

"token_indexers": {
            "bert": {
                "type": "bert-pretrained",
                "do_lowercase": "false",
                "pretrained_model": "/home/tomaz/neo4j/scibert/model/vocab.txt",
                "use_starting_offsets": true
            }
        }

我正在使用 allenlp 版本

名称:allennlp 版本:1.2.1

编辑:

我认为我已经取得了很大的进步,我必须使用用于训练模型的相同版本,并且我可以像这样导入模块:

from allennlp.predictors.predictor import Predictor
from scibert.models.bert_crf_tagger import *
from scibert.models.bert_text_classifier import *
from scibert.models.dummy_seq2seq import *
from scibert.dataset_readers.classification_dataset_reader import *

predictor = Predictor.from_path("scibert_ner/model.tar.gz")
dataset_reader="classification_dataset_reader")
predictor.predict(
  sentence="Did Uriah honestly think he could beat The Legend of Zelda in under three hours?"
)

现在我得到一个错误:

模型类型 bert_crf_tagger 没有默认预测器。\n请指定一个 显式预测器

我知道我可以使用 predictor_name 来明确指定一个预测器,但我不知道选择哪个名称会起作用

【问题讨论】:

  • 这是来自哪个存储库?
  • 来自官方sciber:github.com/allenai/scibert
  • 并且训练脚本在/scripts/train_allennlp_local.sh下可以找到
  • 感觉我需要以某种方式包含可用的模型:scibert/models,不完全确定如何在 python 中加载它...是否有 CLI 预测命令和数据结构的示例?很难找到任何东西?
  • someone with that problem。改编自this answer,会说类似“如果模型类型已知,那么 AllenNLP 可以自动选择一个预测器,但是没有注册的 bert_crf_tagger 类型的预测器,所以你需要自己提供一个。 Read here for Creating a Predictor

标签: python allennlp


【解决方案1】:

我见过很多人遇到这个问题。在浏览存储库代码后,我发现这是运行预测的最简单方法:

python -m allennlp.run predict /path/to/saved_model/model.tar.gz /path/to/test.txt\
  --include-package scibert --use-dataset-reader\
  --output-file /path/to/where/you/want/predict.txt\
  --predictor  sentence-tagger --batch-size 16

我添加了什么?预测器sentence-tagger。一旦你浏览了存储库,你会发现注册的预测器是sentence-tagger。尽管标记器的DEFAUL_DICT 包含sentence_tagger。很多混乱,对吧?告诉我!

这个答案也让你不用写predictor

【讨论】:

  • 你能指出引用的代码吗?取决于您要执行的任务,可能ner分类与文本分类预测器不同
  • 我不太明白你的问题......但我想你想让我问我到底在哪里找到了“sentence-tagger”。为了回答这个问题,我在这里找到了github.com/ibeltagy/allennlp/blob/master/allennlp/predictors/…。 “sentence_tagger”的预测器注册为@Predictor.register('sentence-tagger')
猜你喜欢
  • 2021-11-30
  • 2019-06-11
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2015-03-26
  • 2022-10-13
相关资源
最近更新 更多