首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >KeyError在汇流变压器管道中使用非默认模型时的应用

KeyError在汇流变压器管道中使用非默认模型时的应用
EN

Stack Overflow用户
提问于 2020-06-10 10:01:46
回答 1查看 2.1K关注 0票数 3

在情感分析管道中使用默认模型没有问题。

代码语言:javascript
运行
复制
# Allocate a pipeline for sentiment-analysis
nlp = pipeline('sentiment-analysis')

nlp('I am a black man.')

>>>[{'label': 'NEGATIVE', 'score': 0.5723695158958435}]

但是,当我试图通过添加一个特定的模型来定制管道时。它抛出一个KeyError。

代码语言:javascript
运行
复制
nlp = pipeline('sentiment-analysis',
               tokenizer = AutoTokenizer.from_pretrained("DeepPavlov/bert-base-cased-conversational"),
               model = AutoModelWithLMHead.from_pretrained("DeepPavlov/bert-base-cased-conversational"))

nlp('I am a black man.')



>>>---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-55-af7e46d6c6c9> in <module>
      3                tokenizer = AutoTokenizer.from_pretrained("DeepPavlov/bert-base-cased-conversational"),
      4             model = AutoModelWithLMHead.from_pretrained("DeepPavlov/bert-base-cased-conversational"))
----> 5 nlp('I am a black man.')
      6 
      7 

~/opt/anaconda3/lib/python3.7/site-packages/transformers/pipelines.py in __call__(self, *args, **kwargs)
    721         outputs = super().__call__(*args, **kwargs)
    722         scores = np.exp(outputs) / np.exp(outputs).sum(-1, keepdims=True)
--> 723         return [{"label": self.model.config.id2label[item.argmax()], "score": item.max().item()} for item in scores]
    724 
    725 

~/opt/anaconda3/lib/python3.7/site-packages/transformers/pipelines.py in <listcomp>(.0)
    721         outputs = super().__call__(*args, **kwargs)
    722         scores = np.exp(outputs) / np.exp(outputs).sum(-1, keepdims=True)
--> 723         return [{"label": self.model.config.id2label[item.argmax()], "score": item.max().item()} for item in scores]
    724 
    725 

KeyError: 58129
EN

回答 1

Stack Overflow用户

发布于 2020-09-30 20:24:42

我也面临着同样的问题。我正在使用squadv2数据集(“a-ware/xlmroberta- set 2”)微调XML的模型。就我而言,KeyError是16岁。

Link

想要在这个问题上寻求帮助,我发现了以下信息:链接,我希望你发现它有帮助。

答案(来自链接)

当模型预测不属于文档一部分的令牌时,管道会抛出异常(例如,最终的特殊令牌SEP)。

我的问题

代码语言:javascript
运行
复制
from transformers import XLMRobertaTokenizer, XLMRobertaForQuestionAnswering
from transformers import pipeline

nlp = pipeline('question-answering', 
                model =  XLMRobertaForQuestionAnswering.from_pretrained('a-ware/xlmroberta-squadv2'),
                tokenizer= XLMRobertaTokenizer.from_pretrained('a-ware/xlmroberta-squadv2'))
代码语言:javascript
运行
复制
nlp(question = "Who was Jim Henson?", context ="Jim Henson was a nice puppet")

---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-15-b5a8ece5e525> in <module>()
      1 context = "Jim Henson was a nice puppet"
      2 # --------------- CON INTERROGACIONES
----> 3 nlp(question = "Who was Jim Henson?", context =context)

1 frames

/usr/local/lib/python3.6/dist-packages/transformers/pipelines.py in <listcomp>(.0)
   1745                         ),
   1746                     }
-> 1747                     for s, e, score in zip(starts, ends, scores)
   1748                 ]
   1749 

KeyError: 16

解决方案1:在上下文的末尾添加标点符号

为了避免试图提取最终令牌(可能是SEP的特殊标记)的错误,我在上下文末尾添加了一个元素(在本例中是标点符号):

代码语言:javascript
运行
复制
nlp(question = "Who was Jim Henson?", context ="Jim Henson was a nice puppet.")

[OUT]
{'answer': 'nice puppet.', 'end': 28, 'score': 0.5742837190628052, 'start': 17}

解决方案2:不要使用管道()

原始模型可以自行处理,以检索正确的令牌索引。

代码语言:javascript
运行
复制
from transformers import XLMRobertaTokenizer, XLMRobertaForQuestionAnswering
import torch

tokenizer = XLMRobertaTokenizer.from_pretrained('a-ware/xlmroberta-squadv2')
model = XLMRobertaForQuestionAnswering.from_pretrained('a-ware/xlmroberta-squadv2')

question, text = "Who was Jim Henson?", "Jim Henson was a nice puppet"
encoding = tokenizer(question, text, return_tensors='pt')
input_ids = encoding['input_ids']
attention_mask = encoding['attention_mask']

start_scores, end_scores = model(input_ids, attention_mask=attention_mask, output_attentions=False)[:2]

all_tokens = tokenizer.convert_ids_to_tokens(input_ids[0])
answer = ' '.join(all_tokens[torch.argmax(start_scores) : torch.argmax(end_scores)+1])
answer = tokenizer.convert_tokens_to_ids(answer.split())
answer = tokenizer.decode(answer)

更新

更详细地看一下您的情况,我发现管道中会话任务的默认模型是distilbert-base-cased (源代码)。

我发布的第一个解决方案确实不是一个很好的解决方案。尝试其他问题我也犯了同样的错误。但是,管道外的模型本身工作正常(如我在解决方案2中所示)。因此,我相信并非所有的模式都可以采用。如果有人对此有更多的了解,请帮助我们。谢谢。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62300836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档