【问题标题】:PyTorch calculate MSE and MAEPyTorch 计算 MSE 和 MAE
【发布时间】:2020-08-13 08:28:45
【问题描述】:

我想计算下面模型的 MSE 和 MAE。该模型在每个 Epoch 之后计算 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)

【问题讨论】:

  • 您能否澄清一下您对整体 MSE 的含义?是所有时期的平均 MSE 吗?
  • 没错。谢谢
  • 然后将每个 epoch 的 MSE 相加并除以 epoch 的数量。

标签: python deep-learning pytorch mse


【解决方案1】:

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

这可能是特定于任务的,但热图回归模型的 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)

【讨论】:

  • 谢谢!在上面的代码中,我以类似的方式进行了计算;我想。 loss = torch.mean((preds - targets)**2) count_error = torch.abs(preds - targets).mean() 这不会给出相同的值吗?对于 mae =mae = running_mse\len(loader_test) 的每个 epoch 之后的代码是否应该是 mae = running_mae\len(loader_test)
  • 对于你的第二个问题,是的,我已经纠正了错字,它应该是 mae = running_mae\len(loader_test)
  • 对于您的第一个问题,计算损失值以通过网络参数反向传播,因此您需要它的梯度。但是错误值仅用于评估目的;你不需要它的梯度,所以你可以只使用它的data 以避免不必要地使用 gpu 内存。请参阅我的更新答案。 PS:您也可以在测试周期的顶部使用with torch.no_grad(): 语句来实现此功能。 @Browed1983
  • 我的荣幸。我会坚持影响论文中使用的格式。这也取决于数据集。对于小数部分,两位数或在某些情况下一位数就足够了。试试这个:"MAE: {0:.2f}".format(mae)
  • n 是批量大小。 y_j 是输出(预测/估计),yhat_j 是目标(基本事实/标签)
猜你喜欢
  • 2021-07-11
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多