日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

numpy 随机数_TF+Numpy减少随机性的影响

發布時間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 numpy 随机数_TF+Numpy减少随机性的影响 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有這么一個段子:

深度學習論文有一半不公開源代碼,另外公開源代碼的一半復現不了,鬼知道作者怎么把結果搞得這么牛逼的.

其中一個原因就是深度學習使用了大量的隨機數,就我一般使用的Python+TensorFlow環境而言,Python的隨機性來自于numpy,而TensorFlow在初始化參數的時候也是使用了隨機數的,當我們復現時,如果隨機數都不一樣,那么得到的結果是否和作者相同就依賴于這個網絡的魯棒性了.

ps:個人感覺,既然大家都說深度學習是尋找局部最優而不是全局最優,那么初始點落在哪是不是找到的局部最優點也不一樣,所以隨機性的影響還是很大的.

先放使用代碼吧,有興趣的可以接著看:

from numpy.random import seed seed(1) from tensorflow import set_random_seed set_random_seed(2)

一.Numpy

一般使用下列的指令來生成隨機數

import numpy as np print (np.random.random())

參考numpy.random.seed()的使用,因為是偽隨機算法,所以這個得到的結果是不固定的,我運行了三次,得到的結果為(這個結果一般是復現不了的):

>>> print (np.random.random()) 0.239562458088 >>> print (np.random.random()) 0.112245171048 >>> print (np.random.random()) 0.627331947322

重新開一個終端,再次運行的結果為:

>>> print (np.random.random()) 0.819976925039 >>> print (np.random.random()) 0.902082170272 >>> print (np.random.random()) 0.856090102495

如何保證兩次開啟終端后得到的結果都是一直的呢,這就需要固定隨機算法的種子點了,numpy.random.seed()來指定隨機數生成時所用算法開始的整數值.

這個函數有這些特性:

  • 如果使用相同的種子值,則每次生成的隨機數都相同;
  • 如果不設置種子值,則系統根據時間來自動選擇種子值,此時每次生成的隨機數因時間差異而不同;(我曾經因為項目需要開啟了多進程,生成了N個相同函數的進程,同時生成隨機數,但是無奈發現生成的隨機數都相同,原因在于N個子進程都是同時生成了,我的解決方法是給每個進程傳入一個參數,表示進程號,即0,1,...,N-1,以這個進程號為種子值去設置隨機數,[Python標準庫]random——偽隨機數生成器講了相關的一部分知識);講了相關的一部分知識);
  • 設置的種子值僅一次有效。
  • 下面來驗證該方法的有效性.

    生成一個測試文件test.py:

    import numpy as np np.random.seed(5) print (np.random.random()) print (np.random.random())

    運行文件python test.py,得到下列結果:

    0.22199317108973948 0.8707323061773764

    再次運行python test.py,得到下列結果:

    0.22199317108973948 0.8707323061773764

    可以看到,兩次的結果是一致的,說明這樣使用就可以把隨機數生成時的隨機性都消除掉了,這樣所有人的結果都是一致的.


    二.TensorFlow

    在TensorFlow中的設置可參考用深度學習每次得到的結果都不一樣,怎么辦?,這是一篇譯文,原文在How to Get Reproducible Results with Keras有興趣的可以看看.

    其大概思想是:

    為了在用同樣的數據訓練同一網絡時確保得到同樣的結果,需要設置隨機數字生成器的種子,在TensorFlow中設置的方法是:

    from tensorflow import set_random_seed set_random_seed(2)

    這里種子點參數可以設置別的整數.

    在實踐中,這樣設置只能保證大體上能夠相同,隨著迭代的進行,loss等還是會有細微的差別,不過依然在可控的范圍內,作者也講了有以下的幾個原因:來自第三方庫的隨機性,使用GPU產生的隨機性,來自復雜模型的隨機性.這些原因很難避免,不過實踐來看,結果都在可控范圍內.


    三.TensorFlow源碼解讀

    首先說明,這個會比較水,先放著等以后再加內容吧.

    官方文檔在set_random_seed.其解釋說有兩種情況:graph-level的種子和operation-level的種子.

    operation-level的種子如下:

    a = tf.random_uniform([1], seed=1)

    需要對變量依次指定種子點,很不方便,一般我們都是全局使用的,因此需要使用graph-level的種子,如下:

    tf.set_random_seed(1234)

    其源代碼位于random_seed.py,里面主要有兩個函數,一個是getseed()函數,一個是setrandomseed()函數.set_randomseed()函數指向context.py.

    里面Context類是相關的,定義了一些私有變量和函數.之外還有一些函數會引用它們.

    get_seed()函數引用global_seed()函數:

    def global_seed():"""Returns the eager mode seed."""return context()._seed # pylint: disable=protected-access

    直接返回私有變量_seed.

    setrandomseed()函數引用set_global_seed(seed)函數:

    def set_global_seed(seed):"""Sets the eager mode seed."""context()._set_global_seed(seed) # pylint: disable=protected-access

    指向context()里面的_set_global_seed(seed)函數:

    def _set_global_seed(self, seed):"""Set a global eager mode seed for random ops."""self._seed = seedself._rng = random.Random(self._seed)# Also clear the kernel cache, to reset any existing seedsif self._context_handle is not None:pywrap_tensorflow.TFE_ContextClearCaches(self._context_handle)

    會設置種子變量_seed,另外_rng的作用可參考_internal_operation_seed()函數:

    def _internal_operation_seed(self):"""Returns a fake operation seed.In eager mode, user shouldn't set or depend on operation seed.Here, we generate a random seed based on global seed to makeoperation's randomness different and depend on the global seed.Returns:A fake operation seed based on global seed."""return self._rng.randint(0, _MAXINT32)

    作用是在eager模式下,不在使用種子變量_seed,而是隨機選擇0到種子變量_seed之間的一個數作為種子變量,為什么要設置就不知道了.

    另外,設置種子變量后在哪有應用就不知道了,留待以后解決吧.

    【已完結】

    總結

    以上是生活随笔為你收集整理的numpy 随机数_TF+Numpy减少随机性的影响的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。