You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

微调BERT进行NER任务时评估阶段遇TypeError问题求助

修正BERT NER评估时的TypeError: cannot unpack non-iterable function object错误

错误根源

valid函数最终返回的是flat_accuracy函数对象,但调用代码predictions, true_labels = valid(...)试图将返回值解包为两个变量,而函数对象不支持解包操作,因此触发该错误。

修正方案

  1. 修改valid函数的返回值:返回函数内部已经收集好的predictions和true_labels列表,而非返回flat_accuracy函数。
  2. 清理重复代码:你定义了两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:10:19