set_seed(8 * fold_idx) 被调用了两次,分别在以下两个阶段:
-
模型初始化前(在设置损失函数
criterion和定义global_model之前):set_seed(8 * fold_idx)这个调用的作用是确保在创建模型和其他随机相关变量(如参数初始化等)时,随机数生成器的状态是可控的,从而保证模型的初始化是可重复的。
这种设置对于调试和实验结果的复现非常重要,尤其是在联邦学习这种可能跨多个实验运行的环境中。 -
训练循环开始前(在每个 fold 开始训练前):
set_seed(8 * fold_idx)这个调用的作用是确保训练过程中的随机数生成器状态一致,例如数据加载器中的随机打乱顺序(shuffle)、数据增强操作,以及任何其他需要随机数的操作。这是为了避免由于训练过程中随机性带来的不可控因素影响实验的公平性或结果的稳定性。
为什么需要两次设置?
这两次 set_seed 设置的重点不同:
- 第一次:为了控制模型初始化阶段的随机性,确保所有实验中模型的初始状态一致。
- 第二次:为了控制训练阶段的随机性,保证每个 fold 内的训练数据处理和随机操作是一致的。
这样可以分别对不同的随机性来源进行独立控制,确保从模型初始化到训练过程的每一步都具备可重复性。
是否可以合并为一次?
虽然表面上看似重复,但两次调用的作用不同,实际上不可简单合并。如果合并为一次,可能导致以下问题:
- 如果只在模型初始化前调用
set_seed,训练过程中涉及的随机性(如数据增强或采样)可能失去可控性。 - 如果只在训练循环开始时调用
set_seed,模型初始化阶段的随机性(如权重初始化)可能无法保持一致。
因此,为了严格控制实验的可重复性,两次单独调用是必要且合理的。
【调参侠的修炼笔记2】随机种子Seed的讲人话解释 - 知乎
https://zhuanlan.zhihu.com/p/545344518
7315

被折叠的 条评论
为什么被折叠?



