如何从Bert模型输出中获取注意力部分用于关键词提取?
解决BERT模型输出注意力权重为None的问题
你遇到的核心问题是:默认加载的BERT模型不会返回注意力权重,必须显式开启输出注意力的配置。
直接修改模型初始化代码,添加output_attentions=True参数就行,下面是修正后的完整代码:
from transformers import BertTokenizer, BertModel import torch tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") # 关键:加载模型时指定output_attentions=True model = BertModel.from_pretrained("bert-base-uncased", output_attentions=True) sentence = "This is a sentence" # 用encode_plus简化输入处理,直接得到模型需要的张量 inputs = tokenizer.encode_plus( sentence, return_tensors="pt", add_special_tokens=True # 自动添加[CLS]和[SEP],符合BERT标准输入格式 ) with torch.no_grad(): output = model(**inputs) attention_scores = output.attentions print(attention_scores) # 现在会输出各层的注意力权重了
补充说明:
output_attentions=True会让模型在输出中包含所有注意力层的权重,它是一个列表,每个元素对应BERT某一层的注意力矩阵(形状一般为(batch_size, num_heads, seq_len, seq_len))- 输入处理时必须包含
[CLS]和[SEP]特殊令牌,这是BERT要求的标准输入格式,用encode_plus自动处理比手动分词转ID更稳妥 - 不管是
bert-base-uncased还是bert-large-uncased,只要添加该参数,都能正常输出注意力权重
内容的提问来源于stack exchange,提问作者Gnanaprakash
相关产品推荐
相关产品推荐

