本篇博客针对Less is More: Adaptive Curriculum Learning for Thyroid Nodule Diagnosis论文进行分享。原文
what a brilliant idea
通过debug我们可以知道,label的值只有0和1。也就是说,不论i的值取多少,label[i]的值也都只有0和1两种。
所以,假设i的值等于10,P[i][label[i]]
会表示为P[10][0]
或P[10][1]
。再根据每个batch中label的值,比如:label=[0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0]
这片论文的核心代码分享如下:
# -------------------------------------Get threshold(论文的核心精华部分)-------------------------------------------
for i in range(feats.shape[0]):
# 预测可能性P,并且P的形状为 B(atchSize) × 2
P = torch.nn.Softmax(dim=1)(feats)
# 当label和预测值的最大值不一致时。
Y_pre=torch.argmax(P[i]).item()
if label[i].item() != Y_pre:
# print(label[i].item(),P[i].item())
# 把真实值放入inconsistent_score_list的第一个位置上(First In First Out)what a brilliant idea. 因为label的取值只有0和1两种,所以,label[i]的结果只有0和1。
value=P[i][label[i]]
inconsistent_score_list.append(value.item())
# 如果inconsistent_score_list的队列长度 > HQ 的长度
if len(inconsistent_score_list) > args.HQ_len:
# 直接丢弃这个元素
# print("我从未执行")
inconsistent_score_list.pop(0)
if args.coff_std < 0: # coff_std=-1
certainty_queue.append(torch.max(P[i]).item()) #不论前面的是True还是False,certainty_queue都会存放每一行的最大值
if len(certainty_queue) > args.CQ_len * args.batch_size:
certainty_queue.pop(0)