Pytorch坑——模型可复现性实现,随机种子设置

最近被pytorch的模型复现搞了一波心态,每次训练结果不一样,一开始还以为自己的网络优化有效,谁知每次训练结果是不固定的,调了很久终于让模型固定了下来,在此记录下这个坑。
针对pytorch1.7.1进行随机种子的设置,使得网络每次训练结果固定。这样就能方便查看是修改网络导致的精度提升还是随机性导致的。

def setup_seed(seed):
	#  下面两个常规设置了,用来np和random的话要设置 
    np.random.seed(seed) 
    random.seed(seed)
    
    os.environ['PYTHONHASHSEED'] = str(seed)  # 禁止hash随机化
    os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'  # 在cuda 10.2及以上的版本中,需要设置以下环境变量来保证cuda的结果可复现
    
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed) # 多GPU训练需要设置这个
    torch.manual_seed(seed)
    
    torch.use_deterministic_algorithms(True) # 一些操作使用了原子操作,不是确定性算法,不能保证可复现,设置这个禁用原子操作,保证使用确定性算法
    torch.backends.cudnn.deterministic = True  # 确保每次返回的卷积算法是确定的
    torch.backends.cudnn.enabled = False  # 禁用cudnn使用非确定性算法
    torch.backends.cudnn.benchmark = False  # 与上面一条代码配套使用,True的话会自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题。False保证实验结果可复现。

除了cuda和cudnn的随机性,若使用Dataloder的话也要注意设置,参照官网:https://pytorch.org/docs/stable/notes/randomness.html

def worker_init_fn(worked_id):
    worker_seed = torch.initial_seed() % 2**32
    np.random.seed(worker_seed)
    random.seed(worker_seed)

Data.DataLoader(
    dataset=xxx, 
    batch_size=xxx,  
    shuffle=xxx,  
    # 关键是下面这两个,上面自己随便设置
    worker_init_fn=worker_init_fn,
    num_workers=0,
)

上述操作应该只能保证在同一设备固定,除非两台设备装的所有环境都一样,可能两台设备的结果都一样。
如果经过上述操作在同一设备仍然固定不了,这就是个值得思考的问题。看看是不是设置了nn.LSTM的dropout参数,听说这个是不能用随机种子固定的,有空到时试一下。

  • 18
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
对于复现经典的 PyTorch 模型,你可以按照以下步骤进行操作: 1. 确定要复现的经典模型:选择你想要复现的经典模型,可以是在计算机视觉、自然语言处理或其他领域中广泛应用的模型,例如 AlexNet、VGG、ResNet 等。 2. 收集模型的相关论文和代码:查找并阅读原始论文,以了解模型的具体结构和训练方法。同时,搜索已经实现的代码库或者 GitHub 上的开源项目,以获取相关的参考代码。 3. 创建 PyTorch 模型:根据论文中描述的模型结构,使用 PyTorch 创建一个对应的模型类。这包括定义模型的网络层、初始化权重等操作。 4. 实现模型训练:根据论文中描述的训练方法,实现相应的训练步骤。这可能包括数据预处理、损失函数定义、优化器选择以及训练循环等。 5. 数据准备:准备用于训练和测试模型的数据集。这可能涉及数据下载、数据预处理、数据划分等。 6. 训练模型:使用准备好的数据集对模型进行训练。根据需要,可以设置训练超参数、学习率调度器等。 7. 模型评估:使用测试集或交叉验证集对训练好的模型进行评估。可以计算准确率、损失值等指标。 8. 模型优化(可选):根据需要,尝试改进模型能。这可能包括调整超参数、尝试不同的优化器、增加正则化等。 9. 结果分析:分析模型能和训练过程,比较实现模型与原论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hilbob

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值