我找到了一个代码片段,是用于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
怎么可能不同?
np.nan != np.nan
。 - Remi Cuingnets
为NaN
时,可能是什么原因? - Tom LordNaN
的更多信息:https://dev59.com/PXNA5IYBdhLWcg3wfN2O#944712 - Nikolaj Š.x / 0.0
将为正无穷大或负无穷大,但0.0 / 0.0
为NaN。然而,在这种情况下,0.0 / 0.0
是不可能的,因为fp不为零,所以如果分子为零,则分母不能为零。然而,从一个无穷大除以另一个无穷大仍然可能导致NaN。值得注意的是,在Python中,特别是使用内置的float
类型,0.0 / 0.0
不会给出NaN,而会引发错误。 - kaya3NaN
值,那么有适当的方法可以进行此验证,这将使代码更易读。s
可以是 NaN 的唯一方式是如果tn == 0
,因此可以在之前进行检查:if fp == 0 or tn == 0: return 1
。 - Sembei Norimaki