随机种子

随机性:

深度学习的一个项目,其中的随机性会非常的大,比如以下因素:

  • 随机生成的模型参数,
  • 可能是随机选取的训练样本顺序
  • 随机dropout

这些并非坏事,因为随机性会让我们的模型更加的健壮,提高泛化性能,但是在另一些阶段,希望模型性能稳定,然后才能得到明显的对比,比如:

  • 调整一些超参数
  • 改进模型结构
  • 优化算法

在神经网络中,参数默认是进行随机初始化的。不同的初始化参数往往会导致不同的结果,当得到比较好的结果时我们通常希望这个结果是可以复现的,在pytorch中,通过设置随机数种子可以达到这个目的。

def set_seed(args):
    random.seed(args.seed)
    np.random.seed(args.seed)
    torch.manual_seed(args.seed)#为CPU设置随机种子
    if args.n_gpu > 0:
        torch.cuda.manual_seed_all(args.seed)#为GPU设置随机种子
    else:
        torch.cuda.manual_seed(args.seed)#单GPU设置
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False
    torch.backends.cudnn.enabled = False
  • torch.backends.cudnn.deterministic = True和下述的benchmark搭配使用,确定卷积算法的类型。
  • torch.backends.cudnn.benchmark = False是cudnn使用确定性卷积,而不是使用优化提速型的卷积
    (这个的意思是cudnn在开始时会对模型的每个卷积层使用合适的卷积算法加速,由于卷积网络的kernel大小,数量,计算方式等等,选用合适的卷积算法会使得后续计算加快) 速度会慢,但是可复现
  • torch.backends.cudnn.enabled = False 直接不使用cudnn底层加速。

如果使用多个GPU,应该使用torch.cuda.manual_seed_all()为所有的GPU设置种子。
在需要生成随机数据的实验中,每次实验都需要生成数据。设置随机种子是为了确保每次生成固定的随机数,这就使得每次实验结果显示一致了,有利于实验的比较和改进。

  • 并且通过设置随机种子之后,同样可以影响到 网络中 dropout 的随机性,pytorch answer
  • 还有就是数据加载的时候 Dataloader 的 shuffle=False 的参数设置,等等。

你可能感兴趣的:(随机种子)