TensorFlow 有幾個操作用來創建不同分布的隨機張量。注意隨機操作是有狀態的,並在每次評估時創建新的隨機值。
下面是一些相關的函數的介紹:
- tf.random_normal
從正態分布中輸出隨機值。
random_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None )
args:
shape:一維整數或 Python 數組表示輸出張量的形狀。
mean:dtype 類型的0-D張量或 Python 值表示正態分布的均值。
stddev:dtype 類型的0-D張量或 Python 值表示正態分布的標准差。
dtype:輸出的類型。
seed:一個 Python 整數。用於為分發創建一個隨機種子。
name:操作的名稱(可選)。
返回:將返回一個指定形狀的張量,通過符合要求的隨機值填充。
- tf.truncated_normal
生成的值遵循具有指定平均值和標准差的正態分布,和tf.random_normal不同之處在於其平均值大於 2 個標准差的值將被丟棄並重新選擇。
tf.truncated_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None )
args:
shape:一維整數或 Python 數組表示輸出張量的形狀。
mean:dtype 類型的 0-D 張量或 Python 值表示截斷正態分布的均值。
stddev:dtype 類型的 0-D 張量或 Python 值表示截斷前正態分布的標准偏差。
dtype:輸出的類型。
seed:一個 Python 整數。用於為分發創建隨機種子。
name:操作的名稱(可選)。
返回:
函數返回指定形狀的張量,通過隨機截斷的符合要求的值填充。
- tf.random_uniform
從均勻分布中輸出隨機值。
random_uniform( shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None )
生成的值在該 [minval, maxval) 范圍內遵循均勻分布。下限 minval 包含在范圍內,而上限 maxval 被排除在外。
args:
shape:一維整數或 Python 數組表示輸出張量的形狀。
minval:dtype 類型的 0-D 張量或 Python 值;生成的隨機值范圍的下限;默認為0。
maxval:dtype 類型的 0-D 張量或 Python 值。要生成的隨機值范圍的上限。如果 dtype 是浮點,則默認為1 。
dtype:輸出的類型:float16、float32、float64、int32、orint64。
seed:一個 Python 整數。用於為分布創建一個隨機種子。
name:操作的名稱(可選)。
返回:
用於填充隨機均勻值的指定形狀的張量。
- tf.random_shuffle
隨機地將張量沿其第一維度打亂。
random_shuffle( value, seed=None, name=None )
張量沿着維度0被重新打亂,使得每個 value[i][j] 被映射到唯一一個 output[m][j]。例如,一個 3x2 張量可能出現的映射是:
[[1, 2], [[5, 6], [3, 4], ==> [1, 2], [5, 6]] [3, 4]]
args:
value:將被打亂的張量。
seed:一個 Python 整數。用於為分布創建一個隨機種子。
name:操作的名稱(可選)。
返回:
與 value 具有相同的形狀和類型的張量,沿着它的第一個維度打亂。
- tf.random_crop
隨機地將張量裁剪為給定的大小。
random_crop( value, size, seed=None, name=None )
以一致選擇的偏移量將一個形狀 size 部分從 value 中切出。需要的條件:value.shape >= size。
如果大小不能裁剪,請傳遞該維度的完整大小。例如,可以使用 size = [crop_height, crop_width, 3] 裁剪 RGB 圖像。
cifar10中就有利用該函數隨機裁剪24*24大小的彩色圖片的例子,代碼如下:
distorted_image = tf.random_crop(reshaped_image, [height, width, 3])
args:
- value:向裁剪輸入張量。
- size:一維張量,大小等級為 value。
- seed:Python 整數。用於創建一個隨機的種子。
- name:此操作的名稱(可選)。
返回:
與 value 具有相同的秩並且與 size 具有相同形狀的裁剪張量。
- tf.multinomial
從多項式分布中抽取樣本。
multinomial( logits, num_samples, seed=None, name=None )
args:
- logits:形狀為 [batch_size, num_classes] 的二維張量;每個切片:[i, :] 表示所有類的非標准化對數概率。
- num_samples:0維張量。為每行切片繪制的獨立樣本數。
- seed:Python整數。用於為分發創建一個隨機種子。
- name:操作的名稱(可選)。
返回:
返回繪制樣品的形狀 [batch_size, num_samples]。
- tf.random_gamma
從每個給定的伽瑪分布中繪制 shape 樣本。一般對這個函數不是很理解,詳細查看伽瑪分布原理。此處僅作介紹。
random_gamma( shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None )
alpha 是形狀參數,beta 是尺度參數。
args:
shape:一維整數張量或 Python 數組。輸出樣本的形狀是按照 alpha/beta-parameterized 分布繪制的。
alpha:一個張量或者 Python 值或者 dtype 類型的 N-D 數組。
beta:一個張量或者 Python 值或者 dtype 類型的 N-D 數組,默認為1。
dtype:alpha、beta 的類型,輸出:float16,float32 或 float64。
seed:一個 Python 整數。用於為分布創建一個隨機種子。
name:操作的名稱(可選)。
返回:
samples:具有 dtype 類型值的帶有形狀 tf.concat(shape, tf.shape(alpha + beta)) 的 Tensor。
- tf.set_random_seed
設置圖形級隨機seed。作用在於可以在不同的圖中重復那些隨機變量的值。
set_random_seed(seed)
可以從兩個seed中獲得依賴隨機seed的操作:圖形級seed和操作級seed。seed必須是整數,對大小沒有要求,只是作為圖形級和操作級標記使用,本節將介紹如何設置圖形級別的seed。
它與操作級別seed的關系如下:
- 如果既沒有設置圖層級也沒有設置操作級別的seed:則使用隨機seed進行該操作。
- 如果設置了圖形級seed,但操作seed沒有設置:系統確定性地選擇與圖形級seed結合的操作seed,以便獲得唯一的隨機序列。
- 如果未設置圖形級seed,但設置了操作seed:使用默認的圖層seed和指定的操作seed來確定隨機序列。
- 如果圖層級seed和操作seed都被設置:則兩個seed將一起用於確定隨機序列。
具體來說,使用seed,牢記以下三點:
- 要在會話中不同圖中生成不同的序列,請不要設置圖層級別seed或操作級別seed;
- 要為會話中的操作在不同圖中生成相同的可重復序列,請為該操作設置seed;
- 要使所有操作生成的隨機序列在會話中的不同圖中都可重復,請設置圖形級別seed;
#-*-coding:utf-8-*- #不同情況請注釋或取消注釋相關語句 import tensorflow as tf #第一種情形:無seed a = tf.random_uniform([1]) #第二種情形:操作級seed #a = tf.random_uniform([1], seed=-8) #第三種情形:圖層級seed #tf.set_random_seed(1234) #a = tf.random_uniform([1]) b = tf.random_normal([1]) tf.global_variables_initializer() print("Session 1") with tf.Session() as sess1: print(sess1.run(a)) # a1 print(sess1.run(a)) # a2 print(sess1.run(b)) # b1 print(sess1.run(b)) # b2 print("Session 2") with tf.Session() as sess2: print(sess2.run(a)) # a3(第一種情形a1!=a3;第二種情形a1==a3;第三種情形a1==a3) print(sess2.run(a)) # a4(同上) print(sess2.run(b)) # b3(第一種情形b1!=b3;第二種情形b1!=b3;第三種情形b1==b3) print(sess2.run(b)) # b4(同上)
上述函數都含有seed參數,屬於操作級seed。
示例:
#-*-coding:utf-8-*- #隨機問題每次運行的結果都不大一樣 import tensorflow as tf x= tf.multinomial(tf.log([[10., 10.]]), 5) y=tf.random_normal([2,3],mean=1,stddev=3) z=tf.truncated_normal([2,3],mean=1,stddev=3) w=tf.random_uniform([1,3],9,16) v=tf.random_shuffle([[1,2,3],[4,5,6]]) u=tf.random_crop([[2,4,6],[9,8,0]],[2,2]) a = tf.constant([[1., 2., 3., 4., 1.], [3., 2., 3., 4., 3.]], name='a') b = tf.multinomial(a, 1, name='b') sess = tf.Session() sess.run(tf.global_variables_initializer()) print (sess.run(x)) print (sess.run(y)) print (sess.run(z)) print (sess.run(w)) print (sess.run(v)) print (sess.run(u)) print (sess.run(a)) print (sess.run(b))
不得不提的是,嚴謹點,上述代碼雖然簡單,但都沒有在最后sess.close,關閉圖並且釋放其占用的內存,又或者用with語句塊,讀者不妨加上。