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)