通过设置全局随机种子使得每次的训练结果相同可以复现
1
2
3
4
5
6
7
|
def seed_torch(seed = 2018 ):
random.seed(seed)
os.environ[ 'PYTHONHASHSEED' ] = str (seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.backends.cudnn.deterministic = True
|
这里我主要讲一下模型在复现结果遇到的一些问题。
首先在固定随机种子之后,每次模型训练出来的结果一定是一样的,如果不相同,那么说明训练过程中一定还有一部分随机性操作没有被固定。
将模型参数保存下来,然后加载模型参数进行测试,如果发现结果和训练过程中得到的结果有差异。
这个时候就需要按照以下步骤进行分析:
1、先改变batchsize,看看实验复现的结果是否会发生变化。如果发生变化就说明batchsize会影响模型推理过程中的参数。
2、检查一下forward中有哪些参数跟batchsize有关,或者是不是代码写错了。比如batchsize就会影响LSTM的模型参数的初始化。
3、最后检查测试集划分batch的时候是否都一样。
1
|
test_loader = DataLoader(test_dataset, batch_size = batchsize, shuffle = True , num_workers = 4 , pin_memory = True )
|
比如这样一行代码,测试集每次都被打乱了,虽然固定了随机种子,但是这样只能保证第k轮的随机种子是一样的,而第1轮和第10轮的随机种子是不一样的。
这样的话,比如模型在第13个epoch收敛,得到的结果在是第13轮的测试集进行测试的,而模型在加载的时候是在第一轮的测试进行测试的,结果自然有差异。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/u010589524/article/details/89371919