pytorch如何能夠保證模型的可重復性


問題背景是這樣的:

我用了自己定義了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

用以保證實驗的可重復性,果然,兩次運行的結果完全一致


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM