我正在运行此文件: https://github.com/huggingface/pytorch-pretrained-BERT/blob/master/examples/run_classifier.py
这是一个输入批次的预测代码:
input_ids = input_ids.to(device)
input_mask = input_mask.to(device)
segment_ids = segment_ids.to(device)
label_ids = label_ids.to(device)
with torch.no_grad():
logits = model(input_ids, segment_ids, input_mask, labels=None)
loss_fct = CrossEntropyLoss()
tmp_eval_loss = loss_fct(logits.view(-1, num_labels), label_ids.view(-1))
eval_loss += tmp_eval_loss.mean().item()
nb_eval_steps += 1
if len(preds) == 0:
preds.append(logits.detach().cpu().numpy())
else:
preds[0] = np.append(preds[0], logits.detach().cpu().numpy(), axis=0)
任务是二进制分类。 我想访问二进制输出。
我已经尝试过了:
curr_pred = logits.detach().cpu()
if len(preds) == 0:
preds.append(curr_pred.numpy())
else:
preds[0] = np.append(preds[0], curr_pred.numpy(), axis=0)
probablities = curr_pred.softmax(1).numpy()[:, 1]
但是结果似乎很奇怪。所以我不确定这是否正确。
我的假设-我正在接收最后一层的输出,因此,在softmax之后,它是真实的概率(dim 2的向量-第一类的概率和第二类的概率)
答案 0 :(得分:0)
查看run_classifier.py代码的这一部分之后:
# copied from the run_classifier.py code
eval_loss = eval_loss / nb_eval_steps
preds = preds[0]
if output_mode == "classification":
preds = np.argmax(preds, axis=1)
elif output_mode == "regression":
preds = np.squeeze(preds)
result = compute_metrics(task_name, preds, all_label_ids.numpy())
您只是想念
preds = preds[0]
preds = np.argmax(preds, axis=1)
然后他们只使用preds计算精度为:
def simple_accuracy(preds, labels):
return (preds == labels).mean()