微调BERT进行NER任务时评估阶段遇TypeError问题求助
修正BERT NER评估时的
TypeError: cannot unpack non-iterable function object错误 错误根源
valid函数最终返回的是flat_accuracy函数对象,但调用代码predictions, true_labels = valid(...)试图将返回值解包为两个变量,而函数对象不支持解包操作,因此触发该错误。
修正方案
- 修改
valid函数的返回值:返回函数内部已经收集好的predictions和true_labels列表,而非返回flat_accuracy函数。 - 清理重复代码:你定义了两个
flat_accuracy函数,保留其中一个即可(推荐保留第二个,因为它对预测结果和标签做了扁平化处理,计算的是单标签层面的准确率,更贴合NER任务的常规评估逻辑)。
修改后的代码
保留一个flat_accuracy函数
from seqeval.metrics import f1_score, accuracy_score import numpy as np def flat_accuracy(preds, labels): flat_preds = np.argmax(preds, axis=2).flatten() flat_labels = labels.flatten() return np.sum(flat_preds == flat_labels)/len(flat_labels)
修改后的valid函数
def valid(model, testing_loader, device): model.eval() eval_loss = 0; eval_accuracy = 0 n_correct = 0; n_wrong = 0; total = 0 predictions , true_labels = [], [] nb_eval_steps, nb_eval_examples = 0, 0 with torch.no_grad(): for _, data in enumerate(testing_loader, 0): for k, v in data.items(): data[k] = v.to(device, dtype = torch.long) ids = data['ids'] mask = data['mask'] targets = data['target_tags'] output = model(**data) loss, logits = output[:2] logits = logits.detach().cpu().numpy() label_ids = targets.to('cpu').numpy() predictions.extend([list(p) for p in np.argmax(logits, axis=2)]) # 改为extend,让true_labels和predictions格式统一(避免嵌套数组) true_labels.extend([list(l) for l in label_ids]) accuracy = flat_accuracy(logits, label_ids) eval_loss += loss.mean().item() eval_accuracy += accuracy nb_eval_examples += ids.size(0) nb_eval_steps += 1 eval_loss = eval_loss/nb_eval_steps print("Validation loss: {}".format(eval_loss)) print("Validation Accuracy: {}".format(eval_accuracy/nb_eval_steps)) # 返回收集到的预测结果与真实标签 return predictions, true_labels
调用代码保持不变
#tags_vals = list(set(df_data[""].values)) predictions, true_labels = valid(model, valid_data_loader, device)
内容的提问来源于stack exchange,提问作者Rahaf XXX
相关产品推荐
相关产品推荐

