在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
相关产品推荐
相关产品推荐

