设置随机种子保证网络可复现性
原文链接:https://zhuanlan.zhihu.com/p/141063432
为什么使用相同的网络结构,跑出来的效果完全不同,用的学习率,迭代次数,batch size 都是一样?固定随机数种子是非常重要的。但是如果你使用的是PyTorch等框架,还要看一下框架的种子是否固定了。还有,如果你用了cuda,别忘了cuda的随机数种子。这里还需要用到torch.backends.cudnn.deterministic
.
benchmark 设置False,是为了保证不使用选择卷积算法的机制,使用固定的卷积算法。但是,就算是固定的卷积算法,由于其实现不同,也可能是不可控制的,即相同的值,同一个算法卷积出来有细微差别,deterministic设置True保证使用确定性的卷积算法,二者配合起来,才能保证卷积操作的一致性
因此将torch.backends.cudnn.deterministic
这个 flag 置为True的话,每次返回的卷积算法将是确定的,即默认算法。如果配合上设置 Torch 的随机种子为固定值的话,应该可以保证每次运行网络的时候相同输入的输出是固定的,代码大致这样:
def seed_everything(seed=1029):
'''
设置整个开发环境的seed
:param seed:
:param device:
:return:
'''
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
# some cudnn methods can be random even after fixing the seed
# unless you tell it to be deterministic
torch.backends.cudnn.deterministic = True
#如果torch.backends.cudnn.benchmark = False,那么模型的表现可能不是最优的,但reproducibility是比较强的
torch.backends.cudnn.benchmark = False