首页 📨报错记录

1. 问题描述

记录P0033代码实现的一个Bug

具体描述是:我用同一个正样本和多个负样本构建了多个数据集,然后使用训练好的模型在数据集进行预测,第一个样本集表现良好,后面的几个样本集直接糊了(预测出来的值都是相同的)

2. 问题猜想

问题猜想1是:
训练模型的时候,采用了

model.train()

在测试模型和使用模型的时候也使用了:

model.eval()

问题猜想2是:

当时猜想是不是在使用模型的时候参数变化了,所以使用了:

with torch.no_grad():

后来还不放心,把所有可导的模型参数全部设定为不可导,使用:

for param in graphrec.parameters():
   print("param.requires_grad:{}".format(param.requires_grad))
   param.requires_grad = False
   print("param.requires_grad:------>{}".format(param.requires_grad))

问题猜想3是:
怀疑是随机种子的问题,把所有能固定的随机种子都固定了

def set_seed(seed):
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

只要遇到我就设定一下

问题猜想4是:
怀疑是数据分批之后打乱的问题,设定了半天,也没有用

train_loader = torch.utils.data.DataLoader(train_set, batch_size=args.batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_set, batch_size=args.test_batch_size, shuffle=False)
update_loader = torch.utils.data.DataLoader(update_set, batch_size=args.other_batch_size, shuffle=False)

3. 实际存在的Bug

实际存在的问题是我在构建正负样本集的时候,固定了随机种子

SEED = 101
random.seed(SEED)
rand = random.random
lst_zeros_add = random.sample(lst_zeros, k=len_zeros_add)

最后的结果导致,第一个样本集训练测试的很好,后面的样本集测试效果很糊。

4. 解决方案

把构建样本的随机种子去掉,真正的随机

rand = random.random
lst_zeros_add = random.sample(lst_zeros, k=len_zeros_add)



文章评论

目录