Pytorch 随机数种子设置

一般而言,可以按照如下方式固定随机数种子,以便复现实验:

# 来自相关于 GCN 代码: 例如 grand.py 等的代码

parser.add_argument('--seed', type=int, default=42, help='Random seed.')

np.random.seed(args.seed)
torch.manual_seed(args.seed)
if args.cuda:
    torch.cuda.manual_seed(args.seed)
# 自己之前所写的 noisy label 的代码,参照某一篇 blog
def seed_torch(seed=0):
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

即使设置了随机数种子, 当改写了几行代码 ,即使期望实现功能完全相同,但也可能无法复现原来的结果

原因在于:随机数是顺序生成的,如果中间被额外的步骤多调用了一次随机数生成器,就会导致最终的结果完全不同。

例如:优化 \(loss1+\lambda\times loss2\)

假定 \(loss1\)的计算过程要用到随机数, 若在 \(loss2\) 的计算过程中也要调用了随机数发生器,则会打乱先前供计算 \(loss1\) 使用的随机数列,导致如下两种情况最终结果不同:

  • case 1: 仅优化 \(loss1\),不计算 \(loss2\)
  • case 2: 优化 \(loss1+0.0\times loss2\) (这里设置 \(loss2\) 项前的参数 \(\lambda\) 为 \(0.0\), 也即没有参与最终的优化。)

python 在主函数中设置随机数种子,似乎也可以将子函数 or 其他被主函数调用的随机模块给固定下来。https://www.cnblogs.com/yongjieShi/p/9594349.html