Python 伯特转换';span注释';使用拥抱脸部模型的分数来回答问题

Python 伯特转换';span注释';使用拥抱脸部模型的分数来回答问题,python,pytorch,bert-language-model,huggingface-transformers,Python,Pytorch,Bert Language Model,Huggingface Transformers,下面我将介绍如何从huggingface导入一个经过预训练的模型问答模型 from transformers import BertTokenizer, BertForQuestionAnswering import torch tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForQuestionAnswering.from_pretrained('bert-base-uncased') qu

下面我将介绍如何从huggingface导入一个经过预训练的模型问答模型

from transformers import BertTokenizer, BertForQuestionAnswering
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForQuestionAnswering.from_pretrained('bert-base-uncased')
question, text = "Who was Jim Henson?", "Jim Henson was a nice puppet"
inputs = tokenizer(question, text, return_tensors='pt')
start_positions = torch.tensor([1])
end_positions = torch.tensor([3])
outputs = model(**inputs, start_positions=start_positions, end_positions=end_positions)
loss = outputs.loss
start_scores = outputs.start_logits
end_scores = outputs.end_logits

这将返回开始和结束分数,但是如何从这里获得有意义的文本答案呢?

因此我做了一些深入的研究,看起来分数可以转换为可用于构建答案的标记。下面是一个简短的例子:

answer_start = torch.argmax(start_scores) 
answer_end = torch.argmax(end_scores) + 1

tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(inputs["input_ids"][0][answer_start:answer_end]))

对,QA也被称为“span注释”,所以logits基本上是给你找到答案的索引位置。这就是为什么会有开始和结束的逻辑——模型会告诉你答案的开始在文本中的什么地方,以及答案的结束在文本中的什么地方。@JohnStud是的,这很奇怪,我认为Albert模型的过程是一样的,但看起来有些方法调用没有规范化,因此,在使用其他标记器时,您遵循的流程略有不同