zoukankan      html  css  js  c++  java
  • 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 imes loss2)
    假定 (loss1)的计算过程要用到随机数, 若在 (loss2) 的计算过程中也要调用了随机数发生器,则会打乱先前供计算 (loss1) 使用的随机数列,导致如下两种情况最终结果不同:

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

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

  • 相关阅读:
    代码走读 airflow 2
    sql 查询相关
    控制你的鼠标和键盘
    TODO
    二进制流的操作收集
    daterangepicker-双日历
    datetimepicker使用
    ADO执行事务
    动态添加表sql
    执行带返回值的存储过程
  • 原文地址:https://www.cnblogs.com/Gelthin2017/p/14034762.html
Copyright © 2011-2022 走看看