美文网首页
随机种子

随机种子

作者: 三方斜阳 | 来源:发表于2021-04-10 14:15 被阅读0次

    随机性:

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

    • 随机生成的模型参数,
    • 可能是随机选取的训练样本顺序
    • 随机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 的参数设置,等等。

    相关文章

      网友评论

          本文标题:随机种子

          本文链接:https://www.haomeiwen.com/subject/rwcnkltx.html