通過設置全局隨機種子使得每次的訓練結果相同可以復現(xiàn)
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
這里我主要講一下模型在復現(xiàn)結果遇到的一些問題。
首先在固定隨機種子之后,每次模型訓練出來的結果一定是一樣的,如果不相同,那么說明訓練過程中一定還有一部分隨機性操作沒有被固定。
將模型參數(shù)保存下來,然后加載模型參數(shù)進行測試,如果發(fā)現(xiàn)結果和訓練過程中得到的結果有差異。
這個時候就需要按照以下步驟進行分析:
1、先改變batchsize,看看實驗復現(xiàn)的結果是否會發(fā)生變化。如果發(fā)生變化就說明batchsize會影響模型推理過程中的參數(shù)。
2、檢查一下forward中有哪些參數(shù)跟batchsize有關,或者是不是代碼寫錯了。比如batchsize就會影響LSTM的模型參數(shù)的初始化。
3、最后檢查測試集劃分batch的時候是否都一樣。
test_loader = DataLoader(test_dataset, batch_size=batchsize, shuffle=True, num_workers=4, pin_memory=True)
比如這樣一行代碼,測試集每次都被打亂了,雖然固定了隨機種子,但是這樣只能保證第k輪的隨機種子是一樣的,而第1輪和第10輪的隨機種子是不一樣的。
這樣的話,比如模型在第13個epoch收斂,得到的結果在是第13輪的測試集進行測試的,而模型在加載的時候是在第一輪的測試進行測試的,結果自然有差異。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- 簡述python&pytorch 隨機種子的實現(xiàn)
- Pytorch在dataloader類中設置shuffle的隨機數(shù)種子方式
- PyTorch 如何設置隨機數(shù)種子使結果可復現(xiàn)