2017-02-10 20 views
1

在我的代碼的開始,(一Session的範圍之外),我已經把我的隨機種子 -DropoutWrapper在運行中不確定嗎?

np.random.seed(1) 
tf.set_random_seed(1) 

這就是我輟學的定義看起來像 -

cell = tf.nn.rnn_cell.DropoutWrapper(cell, output_keep_prob=args.keep_prob, seed=1) 

在我的第一個實驗,我保持keep_prob=1。所有獲得的結果都是確定性的。我在多核CPU上運行它。

在我的第二個實驗中,我設置了keep_prob=0.8,並且我運行了相同的代碼兩次。每個代碼有這些陳述,

sess.run(model.cost, feed) 
sess.run(model.cost, feed) 

結果第一次運行的代碼 -

(Pdb) sess.run(model.cost, feed) 
4.9555049 
(Pdb) sess.run(model.cost, feed) 
4.9548969 

預期的行爲,因爲DropoutWrapper使用random_uniform

結果的第二代碼運行 -

(Pdb) sess.run(model.cost, feed) 
4.9551616 
(Pdb) sess.run(model.cost, feed) 
4.9552417 

爲什麼儘管限定的操作,並且圖種子該序列不相同的第二輸出?

+0

如果您使用keep_prob = 1.0,您會得到相同的結果嗎?有各種各樣的東西可以引入非確定性,例如多線程操作,GPU操作(尤其是使用[CUDA atomics]的操作)(https://github.com/tensorflow/tensorflow/issues/2732#issuecomment-224661591)) ,SSE [說明](http://blog.nag.com/2011/02/wandering-precision.html) –

+0

@YaroslavBulatov,我得到'keep_prob = 1'的相同結果。我只使用CPU TensorFlow – martianwars

+1

如果您還設置操作級別種子,該怎麼辦? ([文檔](https://github.com/petewarden/tensorflow_makefile/blob/master/tensorflow/g3doc/api_docs/python/functions_and_classes/tf.set_random_seed.md)) –

回答

3

答案在評論中已經提供了,但沒有人寫它明確的是,所以這裏是:

dynamic_rnn將在內部使用tf.while_loop,可以並行實際評估多個迭代(上看到的文檔parallel_iterations)。在實踐中,如果loop-body或loop-cond內的所有內容都依賴於以前的值,則它不能並行運行任何內容,但可能會有不依賴於以前值的計算。這些將被並行評估。在你的情況下,DropoutWrapper裏面,你必須在某個時刻某事像這樣:

random_ops.random_uniform(noise_shape, ...) 

這種操作是獨立於循環的先前的值,因此它可以並行計算所有的時間步驟。如果你做這樣的並行執行,那麼哪個時間幀會得到哪個丟失掩碼將是非確定性的。