2015-09-06 89 views
40

可重複的結果我得到不同的結果(測試精度)每次我任何keras進口之前運行從Keras框架(https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py) 的代碼包含在頂部np.random.seed(1337)imdb_lstm.py例子時間。它應該防止它爲每次運行生成不同的數字。我錯過了什麼?如何獲得keras

UPDATE:如何瑞普:

  1. 安裝Keras(http://keras.io/
  2. 執行https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py幾次。它將訓練模型並輸出測試精度。
    預期結果:每次運行測試的準確性都是一樣的。
    實際結果:每次運行測試精度都不同。

UPDATE2:我運行它在Windows 8.1中使用MinGW/MSYS,模塊版本:
theano 0.7.0
numpy的1.8.1
SciPy的0.14.0c1

UPDATE3:我收窄這個問題倒退了一點。如果我用GPU運行這個例子(設置theano flag device = gpu0),那麼我每次都得到不同的測試精度,但是如果我在CPU上運行它,那麼一切都按預期工作。我的顯卡:NVIDIA GeForce GT 635)

+0

我不能複製運行的代碼在Ubuntu 14.04 –

+0

'theano - > 0.6.0','numpy的 - >「1.9.2'','SciPy的 - > '0.15.1' ' –

+0

也許問題是,我使用Windows。 numpy.random.uniform工作正常,總是產生相同的結果。 –

回答

10

Theano的documentation討論了播種隨機變量的困難,以及爲什麼它們使用自己的隨機數生成器爲每個圖實例播種。

共享不同{{{RandomOp}}} 實例之間的隨機數生成器使得難以無論 在圖表其他OPS的製造相同的流,並且保持{{{RandomOps}}}隔離。 因此,圖中的每個{{{RandomOp}}}實例將擁有其自己的隨機數生成器。該隨機數發生器是該函數的輸入 。在典型用法中,我們將使用 函數輸入({{{value}}},{{{update}}}}的新特性爲每個{{{RandomOp}}}傳遞和更新rng 。通過傳遞RNG作爲輸入, 可以使用訪問函數輸入的常規方法來訪問每個{{{RandomOp}}}的rng。在這種方法中,沒有預先存在的機制來處理整個 圖的組合隨機數狀態。因此,建議通過輔助功能提供遺漏的功能( 後三個要求):{{{seed,getstate, setstate}}}。

他們還提供examples關於如何播種所有的隨機數發生器。

您也可以通過該對象的種子方法對由RandomMreams對象分配的所有隨機變量進行種子播種。這個種子將是 用於播種一個臨時的隨機數發生器,這又將爲 生成每個隨機變量的種子。

>>> srng.seed(902340) # seeds rv_u and rv_n with different seeds each 
+8

但爲了種子他們,我們需要訪問keano將使用的theano的隨機對象。是否可以通過keras API來完成? – max

0

我同意與先前的評論,但重複的結果有時需要在相同的環境(例如,安裝的軟件包,機械特性等)。因此,我建議將您的環境複製到其他地方以防重複結果。嘗試使用下一種技術之一:

  1. Docker。如果你有一個Linux,這很容易將你的環境移到其他地方。您也可以嘗試使用DockerHub
  2. Binder。這是一個複製科學實驗的雲平臺。
  3. Everware。這是另一個「可重用科學」的雲平臺。請參閱Github上的project repository
+0

我的問題是,當我運行兩次訓練時,即使在相同的環境下,我也無法獲得可重現的結果。 –

0

我已經訓練和測試了Sequential()種使用Keras的神經網絡。我對噪音語音數據進行非線性迴歸。我用下面的代碼來生成隨機種子:

import numpy as np 
seed = 7 
np.random.seed(seed) 

在同數據I訓練每個時間和測試我得到的val_loss完全相同的結果。

+1

你使用過GPU嗎?什麼後端:Theano或TensorFlow? –

+0

我用了Theano後端的CPU。 –

+1

明白了。 CPU也適用於我。我只在GPU上運行時遇到問題。 –

1

我想補充一些以前的答案。如果您使用蟒蛇3和你想獲得可重複的結果每次運行,你必須

  1. 集代碼
  2. 給PYTHONHASHSEED = 0的開始numpy.random.seed作爲參數傳遞給蟒編譯器
+0

不再有效。 – Dmitry

6

我終於用我的代碼得到了可重現的結果。這是我在網絡上看到的答案的組合。第一件事是做什麼@alex說:

  1. 設置numpy.random.seed;
  2. 使用PYTHONHASHSEED=0爲Python 3

然後,你必須致電Keras代碼具有以下附加THEANO_FLAGS來解決@ user2805751關於cuDNN注意的問題:

  • dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic
  • 最後,你需要修補Theano安裝按this comment,基本上在於:

    1. theano/sandbox/cuda/opt.py中的所有呼叫替換爲*_dev20運營商的常規版本。

    這應該會得到相同結果的相同種子。

    請注意,可能會有放緩。我看到運行時間增加了大約10%。