random seed操作其實分為兩種:graph-level(圖級)和op-level(操作級),隨機數生成種子是在數據流圖資源上運作的,接下來讓我具體介紹它們。
第一種情況:要在Session中生成不同的序列,請既不設置圖級別也不設置op級別種子:
a = tf.random_uniform([1]) b = tf.random_normal([1])
print( "Session 1") with tf.Session() as sess1: print (sess1.run(a)) # generates 'A1' print (sess1.run(a)) # generates 'A2' print (sess1.run(b)) # generates 'B1' print (sess1.run(b)) # generates 'B2' print( "Session 2") with tf.Session() as sess2: print (sess2.run(a)) # generates 'A3' print (sess2.run(a)) # generates 'A4' print (sess2.run(b)) # generates 'B3' print (sess2.run(b)) # generates 'B4'
實驗結果:
可以明顯看出,無論是在同一個Session還是在不同的Session中,生成的序列都不同。
第二種情況:要為跨Session生成相同的可重復序列,請為op設置種子:
import tensorflow as tf a = tf.random_uniform([1], seed=1) #op-level 隨機生成種子 b = tf.random_normal([1]) print( "Session 1") with tf.Session() as sess1: print (sess1.run(a)) # generates 'A1' print (sess1.run(a)) # generates 'A2' print (sess1.run(b)) # generates 'B1' print (sess1.run(b)) # generates 'B2' print( "Session 2") with tf.Session() as sess2: print (sess2.run(a)) # generates 'A3' print (sess2.run(a)) # generates 'A4' print (sess2.run(b)) # generates 'B3' print (sess2.run(b)) # generates 'B4'
實驗結果:
明顯可以看出在op-level級隨機生成種子的操作后,同一個Session內生成不同的序列,跨Session生成相同的序列。
第三種情況:要使所有生成的隨機序列在會話中可重復,就要設置圖級別的種子:
import tensorflow as tf tf.set_random_seed(1234) a = tf.random_uniform([1]) b = tf.random_normal([1]) print( "Session 1") with tf.Session() as sess1: print (sess1.run(a)) # generates 'A1' print (sess1.run(a)) # generates 'A2' print (sess1.run(b)) # generates 'B1' print (sess1.run(b)) # generates 'B2' print( "Session 2") with tf.Session() as sess2: print (sess2.run(a)) # generates 'A3' print (sess2.run(a)) # generates 'A4' print (sess2.run(b)) # generates 'B3' print (sess2.run(b)) # generates 'B4'
明顯可以看出,跨Session生成的所有序列都是重復的,但是在檔額Session里是不同的,這就是graph-level的隨機生成種子。這tf.set_random_seed(interger) 中不同的interger沒有什么不同,只是相同的interger每次生成的序列是固定的。