8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

准确率瞬间提升,而骰子数量增加缓慢(U-Net)

dita 1月前

83 0

我正在训练一个用于 MR 图像脑部提取的模型。我使用 2D U-Net 架构和预训练的 EfficientNetV2B3。def dice_coefficients(y_true, y_pred, smooth=0): Intersection = K.sum(y_tr...

我正在训练一个用于 MRI 图像脑部提取的模型。我使用 2D U-Net 架构和预训练的 EfficientNetV2B3。

def dice_coefficients(y_true, y_pred, smooth=0):

    intersection = K.sum(y_true * y_pred)
    union = K.sum(y_true) + K.sum(y_pred)
    return (2 * intersection + smooth) / (union + smooth)


def dice_coefficients_loss(y_true, y_pred, smooth=0):
    return -dice_coefficients(y_true, y_pred, smooth)

def iou(y_true, y_pred, smooth=0):
    intersection = K.sum(y_true * y_pred)
    sum = K.sum(y_true + y_pred)
    iou = (intersection + smooth) / (sum - intersection + smooth)
    return iou


### COMPILE THE MODEL
opti = Adam(learning_rate=1e-4)
unet_model5.compile(optimizer=opti,
                  loss=dice_coefficients_loss,
                  metrics=["accuracy", iou, dice_coefficients])

# Early Stopping
early_stopping_unet = EarlyStopping(monitor='loss',
                                             patience=10)

# Learning Rate Adjustment
reduce_lr_unet = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
                              patience=5, min_lr=1e-7)
model_history = unet_model5.fit(train_generator, batch_size = 16, epochs=200,validation_data=val_generator, callbacks = [early_stopping_unet, reduce_lr_unet])

Dice系数损失的演变:

Dice Coefficient Loss

骰子系数的演变:

Dice Coefficient

准确度的演变:

Accuracy

我的骰子和准确度值相当高,但我认为如果我能找出模型的问题(如果有的话)会更好。我尝试更改一些超参数,例如学习率、辍学率、层数。我无法将 batch_size 增加到高于 16,然后它会导致资源耗尽的错误,但我使用的是 3060 Ti,并且我确保 tensorflow 使用我的 gpu。我添加了 batchnorm,否则 val_accuracy 不会增加,出于某种我不明白的原因。如果你能解释一下就太好了。我还将我的预训练模型更改为其他模型,例如 VGG16、InceptionResNetV2,并相应地预处理输入,最后是 EfficientNetV2B3,它给出了最好的结果。(我也在使用早期停止并减少 lr 回调)

为什么准确率会迅速增加,而骰子系数却越来越慢?我怎样才能使准确率超过停留在 0.95 的水平?

帖子版权声明 1、本帖标题:准确率瞬间提升,而骰子数量增加缓慢(U-Net)
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由dita在本站《python》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @simon,我编辑了这个问题,并添加了我的编译和拟合行。我希望它能回答你的问题

  • 感谢更新,这确实很有帮助!由此,我尝试自己回答我的问题:我从您的代码中推断出您实际上正在使用 Keras。Keras 会自动将“准确率”关键字映射到三个指标之一。对于您来说,我猜(我对 Keras 不太熟悉),这应该是

  • DRH 1月前 0 只看Ta
    引用 4

    我尝试将准确度改为 binary_accuracy,但验证和训练的准确度仍然停留在 0.95。第 14 个时期,它们都是 0.95,训练的骰子系数为 0.8,验证的骰子系数为 0.68。第 150 个时期,准确度值为 0.9542,而骰子系数值为 0.94。仍然发生同样的事情。在过去 90 个时期中,准确度值一直是 0.9542。@simon

  • 让我试着回答你的问题的一部分, 为什么准确率会如此迅速地提高,而骰子系数却越来越慢地上升? 我猜这不是你的模型或实现的问题/错误。事实上,我想说,这根本不是一个“问题”,而是你的指标的一个属性:

    • 像素精度衡量的是正确分配的像素数相对于总像素数的比例。因此,从某种意义上说,这是一种将前景和背景像素视为相同值的测量方法。
    • Dice 或 IoU 值仅关注 前景 像素。请注意,您的 dice_coefficients() iou() 实现仅计算前景像素,而从不计算图像中的总像素数。

    现在假设您有一个分割掩码,其中前景像素相对于图像大小只有几个;假设您的正确分割掩码是 [0, 0, 0, 0, 0, 0, 0, 0, 1, 1] 。如果您的网络预测现在全为零( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ),则其准确率已经达到 0.8(因为 80% 的像素已正确分配)。但是,Dice 和 IoU 值都将为零,因为尚未 正确分配 前景

    下面的示例通过几次迭代证明了这一点(我使用 NumPy 进行计算,但这应该没有什么区别):

    import matplotlib.pyplot as plt
    import numpy as np
    
    def dice_coefficients(y_true, y_pred, smooth=0):
        intersection = np.sum(y_true * y_pred)
        union = np.sum(y_true) + np.sum(y_pred)
        return (2 * intersection + smooth) / (union + smooth)
    
    def accuracy(y_true, y_pred, threshold=0.5):
        y_pred = y_pred > threshold
        return (y_true == y_pred).sum() / y_pred.size
    
    y_true = np.asarray([0, 0, 0, 0, 0, 0, 0, 0, 1, 1])
    
    # Round 1: Predict everything as ones
    y_pred = np.asarray([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
    print("Acc.", a1 := accuracy(y_true, y_pred))
    print("Dice", d1 := dice_coefficients(y_true, y_pred))
    
    # Round 2: Predict everything as zeros
    y_pred = np.asarray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    print(a2 := accuracy(y_true, y_pred))
    print(d2 := dice_coefficients(y_true, y_pred))
    
    # Round 3: Predict one foreground pixel correctly
    y_pred = np.asarray([0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
    print(a3 := accuracy(y_true, y_pred))
    print(d3 := dice_coefficients(y_true, y_pred))
    
    # Round 4: Predict all foreground pixels correctly
    y_pred = np.asarray([0, 0, 0, 0, 0, 0, 0, 0, 1, 1])
    print(a4 := accuracy(y_true, y_pred))
    print(d4 := dice_coefficients(y_true, y_pred))
    
    plt.plot([1, 2, 3, 4], [a1, a2, a3, a4], label="Acc.")
    plt.plot([1, 2, 3, 4], [d1, d2, d3, d4], label="Dice")
    plt.legend()
    plt.show()
    

    对应的图是

    底线:尝试理解并感受您使用的指标。​​如果它们的表现不如您所期望的那样,有时可能不是您的 实现 ,而是您的 期望 .

  • 感谢您的精彩解释。请问,我的情况是否属于过度拟合?我是否应该将我的模型视为过度拟合以改善结果?为什么骰子从 0.68 变为 0.95 时准确率仍能稳定在 0.9542?

  • A-E 1月前 0 只看Ta
    引用 7

    关于过度拟合:我不会说你经历了过度拟合。如果你的训练损失下降而你的验证损失稳定或再次增加(或你的准确率/Dice 的倒数),则会出现过度拟合。这不是你看到的情况。相反:从长远来看,你的验证损失表现得就像你的训练损失一样;这意味着你的模型泛化得非常好。事实上,我认为你的模型已经相当不错了,Dice 高于 0.95。

  • 关于准确度:考虑 y_true = [1 0 0] 和 (1) y_pred = [0 0 1] 和 (2) y_pred = [1 1 1]。在这两种情况下,您的准确度都将为 0.33(正确分类的像素的三分之一),而您的 Dice 将从情况 (1) 中的 0.0 上升到情况 (2) 中的 0.5。同样,这是因为准确度和 Dice 系数对(不)正确分配的背景像素的解释不同。

  • 感谢您对过度拟合和准确度的解释。太棒了!我还可以将 Dice 分数提高到 0.9707 ± 0.0007

返回
作者最近主题: