PyTorch计算MSE和MAE

问题描述

我想计算以下模型的MSE和MAE。该模型将在每个纪元后计算MSE。请问我该怎么做才能获得总体MSE值?我可以使用相同的代码来计算MAE吗?非常感谢

model.eval()
for images,paths in tqdm(loader_test):
    images = images.to(device)
    targets = torch.tensor([metadata['count'][os.path.split(path)[-1]] for path in paths]) # B
    targets = targets.float().to(device)

    # forward pass:
    output = model(images) # B x 1 x 9 x 9 (analogous to a heatmap)
    preds = output.sum(dim=[1,2,3]) # predicted cell counts (vector of length B)

    # logging:
    loss = torch.mean((preds - targets)**2)
    count_error = torch.abs(preds - targets).mean()
    mean_test_error += count_error
    writer.add_scalar('test_loss',loss.item(),global_step=global_step)
    writer.add_scalar('test_count_error',count_error.item(),global_step=global_step)
    
    global_step += 1

average_accuracy = 0 
mean_test_error = mean_test_error / len(loader_test)
writer.add_scalar('mean_test_error',mean_test_error.item(),global_step=global_step)
average_accuracy += mean_test_error
average_accuracy = average_accuracy /len(loader_test)
print("Average accuracy: %f" % average_accuracy)
print("Test count error: %f" % mean_test_error)
if mean_test_error < best_test_error:
    best_test_error = mean_test_error
    torch.save({'state_dict':model.state_dict(),'optimizer_state_dict':optimizer.state_dict(),'globalStep':global_step,'train_paths':dataset_train.files,'test_paths':dataset_test.files},checkpoint_path)

解决方法

首先,为简便起见,您希望在测试阶段将批次大小保持为1。

这可能是特定于任务的,但是热图回归模型的MAE和MSE的计算基于以下方程式:

MAE

MSE

这意味着在您的代码中,您应该按以下方式更改计算MAE的行

error = torch.abs(preds - targets).sum().data
squared_error = ((preds - targets)*(preds - targets)).sum().data
runnning_mae += error
runnning_mse += squared_error

然后在纪元结束之后,

mse = math.sqrt(running_mse\len(loader_test))
mae = running_mae\len(loader_test)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...