tensorflow隨機張量創建


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的關系如下:

  1. 如果既沒有設置圖層級也沒有設置操作級別的seed:則使用隨機seed進行該操作。
  2. 如果設置了圖形級seed,但操作seed沒有設置:系統確定性地選擇與圖形級seed結合的操作seed,以便獲得唯一的隨機序列。
  3. 如果未設置圖形級seed,但設置了操作seed:使用默認的圖層seed和指定的操作seed來確定隨機序列。
  4. 如果圖層級seed和操作seed都被設置:則兩個seed將一起用於確定隨機序列。

具體來說,使用seed,牢記以下三點:

  1. 要在會話中不同圖中生成不同的序列,請不要設置圖層級別seed或操作級別seed;
  2. 要為會話中的操作在不同圖中生成相同的可重復序列,請為該操作設置seed;
  3. 要使所有操作生成的隨機序列在會話中的不同圖中都可重復,請設置圖形級別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語句塊,讀者不妨加上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM