最近在写pytorch的程序,遇到了很多问题,总结一下。
1. 定义随机种子rand seed。
常用命令如下:
random.seed(seed)
os.environ["PYTHONHASHSEED"] = str(seed)
numpy.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
这样基本能保证程序每次运行的结果一致,前提是seed相同。
2. 验证(validate) 和测试(test)的时候记得将模型调至验证模式。
所需代码如下:
model.eval()
with torch.no_grad():
3. 模型参数数量的变化会改变模型运行结果,即使变化的参数并没有真正参与学习。
在实验中,我将model中一处并未使用到的GRU从single direction改为bidirection之后,相同输入数据、相同超参数和相同seed的情况下,结果发生了变化。推测原因是模型初始化的时候GRU也参与其中,birectional之后GRU参数量翻倍,所需生成的随机数数量也随之增加。
4. 最重要的一点,在每一个epoch训练结束之后evaluate model performance on validation or testing set, 也会改变模型运行结果。原因是evaluate的过程影响了dataloader中的shuffle,从而使training data出现在batch中的顺序发生变化。