如何解决基于BERT的NER模型在反序列化时给出不一致的预测
我正在尝试在Colab云GPU上使用HuggingFace变压器库训练NER模型,对其进行腌制并将其加载到我自己的CPU上进行预测。
代码
模型如下:
from transformers import BertForTokenClassification
model = BertForTokenClassification.from_pretrained(
"bert-base-cased",num_labels=NUM_LABELS,output_attentions = False,output_hidden_states = False
)
我正在使用此代码段将模型保存在Colab上
import torch
torch.save(model.state_dict(),FILENAME)
然后使用
将其加载到我的本地CPU上
# Initiating an instance of the model type
model_reload = BertForTokenClassification.from_pretrained(
"bert-base-cased",num_labels=len(tag2idx),output_hidden_states = False
)
# Loading the model
model_reload.load_state_dict(torch.load(FILENAME,map_location='cpu'))
model_reload.eval()
用于标记文本并进行实际预测的代码段在Colab GPU笔记本实例和我的CPU笔记本实例上都是相同的。
预期行为
GPU训练的模型行为正确,并对以下标记进行了完美分类:
O [CLS]
O Good
O morning
O,O my
O name
O is
B-per John
I-per Kennedy
O and
O I
O am
O working
O at
B-org Apple
O in
O the
O headquarters
O of
B-geo Cupertino
O [SEP]
实际行为
在加载模型并将其用于在我的CPU上进行预测时,这些预测是完全错误的:
I-eve [CLS]
I-eve Good
I-eve morning
I-eve,I-eve my
I-eve name
I-eve is
I-geo John
B-eve Kennedy
I-eve and
I-eve I
I-eve am
I-eve working
I-eve at
I-gpe Apple
I-eve in
I-eve the
I-eve headquarters
I-eve of
B-org Cupertino
I-eve [SEP]
有人知道为什么它不起作用吗?我错过了什么吗?
解决方法
我修复了它,有两个问题:
-
令牌的索引标签映射是错误的,由于某种原因,list()函数在Colab GPU上的工作方式与我在CPU(??)上的工作方式不同
-
用于保存模型的代码段不正确,对于基于huggingface-transformers库的模型,您不能使用model.save_dict()并稍后加载,您需要使用save_pretrained()方法模型类,然后使用from_pretrained()加载它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。