损失不是表现的一个很好的指标吗?

数据挖掘 深度学习 美国有线电视新闻网 可视化
2022-03-15 12:28:08

我正在尝试使用 3D uNet 网络分割 3D 体积。我已经达到了一个阶段,使用CrossEntropyBCE

idx:  0 of  53 - Validation Loss:  0.029650183394551277
idx:  5 of  53 - Validation Loss:  0.009899887256324291
idx:  10 of  53 - Validation Loss:  0.05049080401659012
idx:  15 of  53 - Validation Loss:  0.02019292116165161
idx:  20 of  53 - Validation Loss:  0.04724293574690819
idx:  25 of  53 - Validation Loss:  0.02810296043753624
idx:  30 of  53 - Validation Loss:  0.02642594277858734
idx:  35 of  53 - Validation Loss:  0.029894422739744186
idx:  40 of  53 - Validation Loss:  0.04158024489879608
idx:  45 of  53 - Validation Loss:  0.04574814811348915
idx:  50 of  53 - Validation Loss:  0.05406259000301361

我假设我的网络运行良好,所以我编写了一个脚本来可视化我的网络输出与它们各自的目标。我得到的是非常不同的东西,而不是证明这种损失的合理性。样本深度为 32,我将每个 z 平面输出为单个图像。这是目标: 在此处输入图像描述

和预测的输出:

在此处输入图像描述

所有样本都是这样的,没有一个准确地代表了报告损失的目标..所以我问我的损失是错误的吗?我应该研究什么来解决这个问题?

谢谢

1个回答

要回答您的问题的标题:

损失不是表现的一个很好的指标吗?

它只是培训课程中表现的相对指标。

首先,到底什么是损失?一般来说,损失是模型预测输出与目标输出之间差异的某种表达。根据使用的损失函数(例如,如果log涉及)或输入本身的标称值,损失的值也可以非常小或非常大。

人们通常对数据进行规范化,因此值更小,但关键是你不能总是说验证损失0.0012345实际上是一个值。或者那12345绝对是坏事!

其他可能的损失函数

我见过的其他 3d 分割模型通常使用骰子系数来计算成本/损失。也许试试看。 Dice系数与F1分数基本相同您确实在权衡如何惩罚模型在分类中的错误,例如像素或体素。你想强烈地惩罚坏情况还是更平均的方法。正如该链接指出的那样,它类似于L1L2损失。

还有 Jaccard 指数,它与 Dice Coefficient 基本相同。

Tversky 指数是两者的概括——它是一种不对称的相似性度量

Tversky(A,B;α,β)=|TruePos||TruePos|+α|FalsePos|+β|FalseNeg|

  • 骰子系数这个α=12β=12
  • Jaccard 指数反而α=1β=1

对于您的问题来调整损失的计算方式,这可能是一个很好的方法。网上有很多资源可以解释更多关于这些定义明确的度量的信息,也许可以帮助您对它们的结果有一个直觉。

你的结果

由于您发布的损失,它实际上看起来并不像您解释的那么好。我不确定您的idx值到底是什么意思,但损失值实际上正在上升:

In [1]: import numpy as np                                                         
In [2]: import pandas as pd
In [3]: import matplotlib.pyplot as plt
In [4]: val_loss = np.array([0.029650183394551277, 0.009899887256324291, 0.0504908040
   ...: 1659012, 0.02019292116165161, 0.04724293574690819, 0.02810296043753624, 0.026
   ...: 42594277858734, 0.029894422739744186, 0.04158024489879608, 0.0457481481134
   ...: 8913, 0.05406259000301361])    
In [5]: pd.Series(val_loss, index=range(0, 51, 5)).plot()                           
Out[5]: <matplotlib.axes._subplots.AxesSubplot at 0x7f4405326390>
In [6]: plt.show()  

你的验证损失

这表明您可能过度拟合。但是,您展示的图像中的预测和基本事实之间的差异表明存在更根本的问题。