基于JSON数据集微调BERT做NER时遇AttributeError错误求助
问题解决:AttributeError: 'TokenClassifierOutput' object has no attribute 'detach'
问题原因
Hugging Face的BERT模型(尤其是AutoModelForTokenClassification)返回的TokenClassifierOutput是一个数据类对象,它包含logits、loss等属性,你不能直接对整个对象调用detach()方法,必须先提取其中的logits张量再进行后续操作。
修正步骤
- 提取
TokenClassifierOutput中的logits属性再执行detach():
把原来的
logits = token_classifier_output2.detach().cpu().numpy()
修改为
logits = token_classifier_output2.logits.detach().cpu().numpy()
- 修复未定义的
tmp_eval_loss变量:
代码中eval_loss += tmp_eval_loss.mean().item()里的tmp_eval_loss未定义,需要替换为带labels参数的输出对象的loss属性:
eval_loss += token_classifier_output1.loss.mean().item()
完整修正后的代码片段
with torch.no_grad(): token_classifier_output1 = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels) token_classifier_output2 = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask) logits = token_classifier_output2.logits.detach().cpu().numpy() label_ids = b_labels.to('cpu').numpy() predictions.extend([list(p) for p in np.argmax(logits, axis=2)]) true_labels.append(label_ids) tmp_eval_accuracy = flat_accuracy(logits, label_ids) eval_loss += token_classifier_output1.loss.mean().item() eval_accuracy += tmp_eval_accuracy nb_eval_examples += b_input_ids.size(0) nb_eval_steps += 1
内容的提问来源于stack exchange,提问作者Amal Bakhsh
相关产品推荐
相关产品推荐

