You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PyTorch自定义指标方法中,s != s的情况何时会出现?

PyTorch特异性指标代码中s != s检查的解析

先看你提供的代码:

def specificity(output, target, t=0.5):
    
    tp, tn, fp, fn = tp_tn_fp_fn(output, target, t)

    if fp == 0:
        return 1
    s = tn / (tn + fp)

    if s != s:
        s = 1

    return s

def tp_tn_fp_fn(output, target, t):
    with torch.no_grad():
        preds = output > t  # torch.argmax(output, dim=1)
        preds = preds.long()
        num_true_neg = torch.sum((preds == target) & (target == 0), dtype=torch.float).item()
        num_true_pos = torch.sum((preds == target) & (target == 1), dtype=torch.float).item()
        num_false_pos = torch.sum((preds != target) & (target == 1), dtype=torch.float).item()
        num_false_neg = torch.sum((preds != target) & (target == 0), dtype=torch.float).item()

    return num_true_pos, num_true_neg, num_false_pos, num_false_neg

疑问解答

1. s != s的作用是什么?

这行代码是用来判断s是否为**NaN(非数字)**的。根据浮点数运算规则,NaN是唯一满足“自身不等于自身”的值,所以这个判断等价于检查s是否是NaN。

2. 为什么s会不等于自身?

当s = tn / (tn + fp)的计算中出现0/0的情况时,结果就会是NaN。虽然代码里提前判断了fp == 0就返回1,但如果tn和fp同时为0(也就是当前batch里没有任何负样本,target中不存在0),这时候分母tn + fp = 0,分子tn = 0,就会触发0/0得到NaN。

3. 为什么要做这个处理?

当没有负样本时,特异性(Specificity)这个指标本身没有统计意义,但如果直接返回NaN会导致TensorBoard无法正常记录指标,甚至可能中断训练流程。所以这里把NaN替换为1,作为一种合理的默认值,保证指标输出的合法性。

内容的提问来源于stack exchange,提问作者PrimuS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:55:19