我已经在 SciIE 数据集上微调了 SciBERT 模型。存储库使用 AllenNLP 来微调模型。训练执行如下:
python -m allennlp.run train $CONFIG_FILE --include-package scibert -s "$@"
Run Code Online (Sandbox Code Playgroud)
成功训练后,我有一个 model.tar.gz 文件作为输出,其中包含 weights.th、config.json 和词汇文件夹。我试图将它加载到 allenlp 预测器中:
from allennlp.predictors.predictor import Predictor
predictor = Predictor.from_path("model.tar.gz")
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
配置错误: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
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 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?"
)
Run Code Online (Sandbox Code Playgroud)
现在我收到一个错误:
模型类型 bert_crf_tagger 没有默认预测器。\n请明确指定预测器
我知道我可以使用predictor_name来明确指定一个预测器,但我还没有最模糊的想法选择哪个名称会起作用
我见过很多人都遇到这个问题。在查看存储库代码后,我发现这是运行预测的最简单方法:
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
Run Code Online (Sandbox Code Playgroud)
我添加了什么?预测者sentence-tagger。一旦您浏览存储库,您会发现注册的预测器是sentence-tagger。尽管DEFAUL_DICT标记器的 包含sentence_tagger. 很多混乱,对吧?告诉我!
这个答案还可以让您免于编写predictor.
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |