問題背景是這樣的:
我用了自己定義了pytorch中的模型,並且,在main函數中設置了隨機種子用來保證模型初始化的參數是一致的,同時pytorch中的隨機種子也能夠影響dropout的作用,見鏈接
為了保證所有的參數都一樣,我在設置dataloader的時候,數據並沒有進行shuffle,這樣能夠在每一個iteration的時候,沒有random的操作
但是,一旦我把模型放到GPU上運行之后,我把網絡中間輸出的feature map保存下來,進行比較,發現同一個位置,兩次運行的feature的值竟然不一樣
難道是網絡的初始化不一樣咩?在第一個iteration運行的時候,還沒有更新參數的時候,我將網絡的參數進行保存成numpy,運行兩次,進行比較,發現兩次模型的參數都一樣!
so, 模型的參數都是一樣的,輸入的數據也是一樣的,難道我自己定義的網絡層里面有一些random的操作?我自己定義的網絡層里面有BN層,卷積以及轉置卷積層,一旦這里面的超參數確定的話,實際上兩次運行的結果應該是absolutely一致的,so,問題出在哪里?
在pytorch forum上看到一個類似的問題,說是在GPU上運行的結果和CPU運行的結果不一致,我試了一下,果然還真是這樣,把模型放到CPU上,兩次運行的結果absolutely一致。
但是仍然不理解,為什么GPU上會有運算誤差,但是我也不能一直在CPU上運行模型吧,於是乎,在網上搜到這樣一個類似的帖子,實際上pytorch forum上吐槽這個問題的人太多,當然解決的辦法也是很簡單
在主函數中加上一句
torch.backends.cudnn.deterministic = True
用以保證實驗的可重復性,果然,兩次運行的結果完全一致