请求协助解决AttributeError:'TokenClassifierOutput'无detach属性问题
解决'TokenClassifierOutput'对象无'detach'属性的报错
你当前的核心问题是把模型返回的TokenClassifierOutput对象直接当成了logits张量处理——这个对象本身没有detach方法,必须先提取它内部的logits属性才能进行后续张量操作。之前你尝试取output.loss也是错误的,因为预测阶段如果不传入labels,loss会是None,而且你要的是用于预测的logits,不是loss。
修正步骤
- 模型调用后,将返回的对象赋值给
output(避免和logits重名混淆) - 从
output中提取真正的logits张量:output.logits - 对提取出的logits执行
detach().cpu().numpy()操作(因为在torch.no_grad()上下文里,detach()可以省略,不过保留也不影响)
修正后的完整代码片段
model.eval() y_true = [] y_pred = [] eval_loss, eval_accuracy = 0, 0 nb_eval_steps, nb_eval_examples = 0, 0 for batch in valid_dataloader: batch = tuple(t.to(device) for t in batch) input_ids, input_mask, label_ids = batch with torch.no_grad(): # 模型返回TokenClassifierOutput对象,先存为output output = model(input_ids, token_type_ids=None, attention_mask=input_mask) # 提取对象中的logits张量再处理 logits = output.logits.detach().cpu().numpy() logits = [list(p) for p in np.argmax(logits, axis=2)] label_ids = label_ids.to('cpu').numpy() input_mask = input_mask.to('cpu').numpy()
额外说明(如果需要计算验证loss)
如果要计算验证集的loss,需要在调用模型时传入labels=label_ids,这样output.loss才会有值:
with torch.no_grad(): output = model(input_ids, token_type_ids=None, attention_mask=input_mask, labels=label_ids) # 此时可以获取并累加loss current_loss = output.loss.detach().cpu().numpy() eval_loss += current_loss
内容的提问来源于stack exchange,提问作者Haneen Alahmadi
相关产品推荐
相关产品推荐

