首页 > 其他分享 >在深度学习模型中添加灵敏度和精确度评价指标

在深度学习模型中添加灵敏度和精确度评价指标

时间:2024-11-18 15:44:36浏览次数:3  
标签:target positive torch 添加 灵敏度 output 精确度

在深度学习模型中添加灵敏度和精确度评价指标

引言

在深度学习的图像分割任务中,评价模型性能的指标至关重要。常用的指标如IoU(Intersection over Union)和Dice系数能够有效地衡量模型的分割效果。然而,单一的评价指标往往无法全面反映模型的性能。因此,本文将介绍如何在深度学习模型中添加灵敏度(Sensitivity)和精确度(Precision)这两个重要的评价指标,并展示其在实际应用中的效果。

为什么要添加灵敏度和精确度

1. 灵敏度(Sensitivity)

灵敏度是指模型正确识别正类样本的能力。在医学图像分割中,灵敏度尤为重要,因为我们希望尽可能多地识别出病变区域。高灵敏度意味着模型能够有效地捕捉到目标区域,减少漏检的风险。

2. 精确度(Precision)

精确度则是指模型在所有预测为正类的样本中,真正为正类的比例。高精确度意味着模型的预测结果更可靠,能够减少误检的情况。在医学应用中,精确度同样重要,因为错误的预测可能导致不必要的治疗或干预。

3. 综合评估

通过同时考虑灵敏度和精确度,我们可以更全面地评估模型的性能,确保其在实际应用中的有效性和可靠性。

如何在代码中实现

1. 定义灵敏度和精确度函数

首先,我们需要定义计算灵敏度和精确度的函数。以下是实现代码:

def sensitivity_score(output, target):
    smooth = 1e-5
    output = torch.sigmoid(output).data.cpu().numpy() if torch.is_tensor(output) else output
    target = target.data.cpu().numpy() if torch.is_tensor(target) else target

    output_1 = output[:, 0, :, :] > 0.5
    output_2 = output[:, 1, :, :] > 0.5
    target_1 = target[:, 0, :, :] > 0.5
    target_2 = target[:, 1, :, :] > 0.5

    true_positive_1 = (output_1 & target_1).sum()
    false_negative_1 = (~output_1 & target_1).sum()
    sensitivity_1 = (true_positive_1 + smooth) / (true_positive_1 + false_negative_1 + smooth)

    true_positive_2 = (output_2 & target_2).sum()
    false_negative_2 = (~output_2 & target_2).sum()
    sensitivity_2 = (true_positive_2 + smooth) / (true_positive_2 + false_negative_2 + smooth)

    return sensitivity_1, sensitivity_2

def precision_score(output, target):
    smooth = 1e-5
    output = torch.sigmoid(output).data.cpu().numpy() if torch.is_tensor(output) else output
    target = target.data.cpu().numpy() if torch.is_tensor(target) else target

    output_1 = output[:, 0, :, :] > 0.5
    output_2 = output[:, 1, :, :] > 0.5
    target_1 = target[:, 0, :, :] > 0.5
    target_2 = target[:, 1, :, :] > 0.5

    true_positive_1 = (output_1 & target_1).sum()
    false_positive_1 = (output_1 & ~target_1).sum()
    precision_1 = (true_positive_1 + smooth) / (true_positive_1 + false_positive_1 + smooth)
    
    true_positive_2 = (output_2 & target_2).sum()
    false_positive_2 = (output_2 & ~target_2).sum()
    precision_2 = (true_positive_2 + smooth) / (true_positive_2 + false_positive_2 + smooth)

    return precision_1, precision_2

2. 在主程序中调用

在模型评估的主程序中,我们可以调用这两个函数来计算灵敏度和精确度,并将结果输出:

def main():
    # ... 现有代码 ...

    sensitivities = AverageMeter()  # 用于存储灵敏度的平均值
    precisions = AverageMeter()      # 用于存储精确度的平均值

    with torch.no_grad():  # 在评估时不需要计算梯度
        for i, (input, target) in tqdm(enumerate(test_dataset), total=len(test_dataset)):
            # 将输入和目标转换为张量并移动到GPU
            input = torch.from_numpy(input).cuda().unsqueeze(0)
            target = torch.from_numpy(target).cuda().unsqueeze(0)

            # 计算模型输出
            output = model(input)

            # 计算灵敏度和精确度
            sensitivity_1, sensitivity_2 = sensitivity_score(output, target)
            precision_1, precision_2 = precision_score(output, target)

            # 更新灵敏度和精确度的平均值
            sensitivities.update(torch.tensor(sensitivity_1), input.size(0))
            sensitivities.update(torch.tensor(sensitivity_2), input.size(0))
            precisions.update(torch.tensor(precision_1), input.size(0))
            precisions.update(torch.tensor(precision_2), input.size(0))

            # ... 现有代码 ...

    # 打印最终的评价指标
    print(f'IoU: {ious.avg:.4f} Dice_1: {dices_1s.avg:.4f} Dice_2: {dices_2s.avg:.4f}')
    print(f'Sensitivity_1: {sensitivities.avg[0]:.4f} Sensitivity_2: {sensitivities.avg[1]:.4f}')
    print(f'Precision_1: {precisions.avg[0]:.4f} Precision_2: {precisions.avg[1]:.4f}')

3. 结果分析

在运行完模型评估后,我们可以得到灵敏度和精确度的结果。例如:

IoU: 0.8590
Dice_1: 0.9190
Dice_2: 0.6412
Sensitivity_1: 0.9362
Sensitivity_2: 0.7676
Precision_1: 0.9371
Precision_2: 0.7942

从结果中可以看出,模型在分割任务中表现良好,尤其是在灵敏度和精确度方面。这表明模型能够有效地识别目标区域,并且在预测结果中具有较高的可靠性。

结论

在深度学习模型中添加灵敏度和精确度这两个评价指标,可以帮助我们更全面地评估模型的性能。通过这些指标,我们能够更好地理解模型在实际应用中的表现,尤其是在医学图像分割等关键领域。希望本文能够帮助你在自己的项目中实现更全面的模型评估。

如果你对本文有任何疑问或建议,欢迎在评论区留言讨论!

标签:target,positive,torch,添加,灵敏度,output,精确度
From: https://blog.csdn.net/qq_63860529/article/details/143859236

相关文章

  • leetcode211. 添加与搜索单词 - 数据结构设计
    请你设计一个数据结构,支持添加新单词和查找字符串是否与任何先前添加的字符串匹配。实现词典类 WordDictionary :WordDictionary() 初始化词典对象voidaddWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配boolsearch(word) 如果数据结构中存在字符串与......
  • PowerDesigner 12小技巧-pd修改外键命名规则-pd添加外键
    PowerDesigner12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键1.附加:工具栏不见了调色板(Palette)快捷工具栏不见了PowerDesigner 快捷工具栏palette不见了,怎么重新打开,找回来呢上网搜索了一下”powerdesigner图形工具栏”,找到了找回PowerDesigner工具......
  • emacs使用lsp-copilot作为lsp-client添加新语言的lsp配置
    配置文件可以参考helix的lsp配置文件helix/languages.tomlatmaster·helix-editor/helix例如添加go的lsp配置使用M-xlsp-copilot-open-config-file打开配置文件[language-server.gopls]command="gopls"[language-server.gopls.config.hints]assignVariableTypes=t......
  • 在 SQL Server 中,创建表时可以直接为字段添加唯一约束(UNIQUE)
    在SQLServer中,创建表时可以直接为字段添加唯一约束(UNIQUE)。在CREATETABLE语句中,定义字段时,可以使用UNIQUE关键字来确保该字段的值唯一。语法:sqlCREATETABLEyour_table(aINTUNIQUE,--其他字段);假设你需要创建一个表employees,其中字段email需要保......
  • Pointnet++改进68:添加FFCM |融合傅里叶卷积
    简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入,提升性能。3.专栏持续更新,紧随最新的研究内容。目录1.理论介绍2.修改步骤2.1步骤一     2.2步骤二     2.3步骤三1......
  • go fiber:全局中间件添加排除的path
    一,代码:全局中间件对所有的api生效,如果有个别不想应用全局中间件的api,则需要从代码中进行排除:例如:支付宝或微信的回调接口packagemiddlewareimport( "fmt" "github.com/gofiber/fiber/v2""regexp")funcApiSign(c*fiber.Ctx)error{//得到当前url ......
  • (mongodb副本集) PSA模式添加、修改节点
    (mongodb副本集)PSA模式添加、修改节点PSA模式介绍PSA模式(Primary-Secondary-Arbiter)是MongoDB复制集中的一种架构配置。在这种模式下,复制集由一个主节点(PRIMARY)、一个从节点(SECONDARY)和一个仲裁者节点(ARBITER)组成。在MongoDB的复制集中,仲裁者节点(Arbiter)是一种特殊类型的节点,......
  • (mongodb副本集) PSA模式添加、修改节点
    (mongodb副本集)PSA模式添加、修改节点PSA模式介绍PSA模式(Primary-Secondary-Arbiter)是MongoDB复制集中的一种架构配置。在这种模式下,复制集由一个主节点(PRIMARY)、一个从节点(SECONDARY)和一个仲裁者节点(ARBITER)组成。在MongoDB的复制集中,仲裁者节点(Arbiter)是一种特殊类型的节点,......
  • (mongodb副本集) PSA模式添加、修改节点
    (mongodb副本集)PSA模式添加、修改节点PSA模式介绍PSA模式(Primary-Secondary-Arbiter)是MongoDB复制集中的一种架构配置。在这种模式下,复制集由一个主节点(PRIMARY)、一个从节点(SECONDARY)和一个仲裁者节点(ARBITER)组成。在MongoDB的复制集中,仲裁者节点(Arbiter)是一种特殊类型的节点,......
  • SQL Server数据库添加只读用户
    需求描述笔者手头有一个已经部署好的SQLServer数据库,现需要给外部人员开通访问权限,但又要避免外部人员误操作污染数据库,所以这里选择给他们配置数据库只读用户。详细配置步骤我们打开MicrosoftSQLServerManagementStudio(简称SSMS),连接对应数据库引擎,如下图菜单位置,右键点......