一个方法中什么时候会出现"s != s"?

3

我找到了一个代码片段,是用于tensorboard(pytorch训练)的自定义度量(metric)。

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

就计算本身而言,它足够容易理解。

我不理解的是 s!= s。 这个检查是什么意思,这两个 s 怎么可能不同?


1
这是处理除以0的一种方法。它适用于NaN。例如,检查np.nan != np.nan - Remi Cuingnet
sNaN时,可能是什么原因? - Tom Lord
关于NaN的更多信息:https://dev59.com/PXNA5IYBdhLWcg3wfN2O#944712 - Nikolaj Š.
2
NaN不是每个除以零的结果;根据IEEE 754浮点运算规范,当x不为零时,x / 0.0将为正无穷大或负无穷大,但0.0 / 0.0为NaN。然而,在这种情况下,0.0 / 0.0是不可能的,因为fp不为零,所以如果分子为零,则分母不能为零。然而,从一个无穷大除以另一个无穷大仍然可能导致NaN。值得注意的是,在Python中,特别是使用内置的float类型,0.0 / 0.0不会给出NaN,而会引发错误。 - kaya3
1
这是我认为的糟糕代码。如果它要检查的是 NaN 值,那么有适当的方法可以进行此验证,这将使代码更易读。s 可以是 NaN 的唯一方式是如果 tn == 0,因此可以在之前进行检查:if fp == 0 or tn == 0: return 1 - Sembei Norimaki
1个回答

2

因为这与机器学习有关,我会假设数据都是数字。唯一一个使得 s != s 成立的数字是特殊的非数字值 nan。任何与 nan 的比较都是 false,因此可以得出 nan 不等于它自己。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接