1. 程式人生 > >tensorflow學習之Constant、Variable、placeholder

tensorflow學習之Constant、Variable、placeholder

Constant、Variable、placeholder

自己理解同時結合網路多方資源,如有侵權,請通知我刪除。

前提知識是理解tensor即張量的含義。

  1. tf.constant(value ,dtype = None ,shape = None ,name = ‘Const’ ,verify_shape = False )
    構造一個不可變的張量。一般可以在神經網路圖中作為一個固定不變的節點。constant為trainable為Flase

引數:
value:輸出型別 dtype 的常量值 (或列表)。
dtype:所得張量的元素型別。
shape:所得張量的可選維度。
name:張量的可選名稱。
verify_shape:是否驗證value的shape和指定shape相符,若設為True則進行驗證,不相符時會丟擲異常。

# 建立一維的張量.
tensor = tf.constant([1, 2, 3, 4, 5, 6, 7]) 
# 輸出: [1 2 3 4 5 6 7]

# 建立二維的張量.
tensor = tf.constant(-1.0, shape=[2, 3]) 
tensor = tf.constant([[-1,-1,-1],[-1,-1,-1]])
# 輸出:[[-1. -1. -1.]
#        [-1. -1. -1.]]
# 其他建立常量的方式
tf.zeros(shape, dtype=tf.float32, name=None)
# 建立一個shape形狀的元素全0的張量
tf.zeros_like(tensor, dtype=None, name=None) # 建立一個shape為tensor的shape的張量 tensor = [[-1,-1,-1],[-1,-1,-1]] result = tf.zeros_like(tensor) # tensor的shape為(2,3),result的shape結果也為(2,3) # 輸出:[[0. 0. 0.] # [0. 0. 0.]] tf.ones(shape, dtype=tf.float32, name=None) # 建立一個shape形狀的元素全1的張量 tf.ones_like(tensor,
dtype=None, name=None) # tensor的shape為(2,3),result的shape結果也為(2,3) # 輸出:[[1. 1. 1.] # [1. 1. 1.]] tf.fill(dims, value, name=None) # 建立一個維度為dims,值為value的tensor物件.該操作會建立一個維度為dims的tensor物件,並將其值設定為value,該tensor物件中的值型別# 和value一致 # 當value為0時,該方法等同於tf.zeros() # 當value為1時,該方法等同於tf.ones() # 引數: # dims: 型別為int32的tensor物件,用於表示輸出的維度(1-D, n-D),通常為一個int32陣列,如:[1], [2,3]等 # value: 常量值(字串,數字等),該引數用於設定到最終返回的tensor物件值中 # name: 當前操作別名(可選) dim = [2,3] tf.fill(dim, 5) # 輸出: #[[5 5 5] # [5 5 5]]
  1. tf.Variable()和tf.get_variable()
    tf.Variable是可訓練的變數。例如在模型中的weights (W)和biases (B)。tf.Variable經常儲存訓練的結果 。

tf.Variable(initial_value=None, trainable=True, collections=None, validate_shape=True, caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None, import_scope=None)

tf.get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None, trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True, custom_getter=None)

使用tf.Variable時,如果檢測到命名衝突,系統會自己處理。使用tf.get_variable()時,系統不會處理衝突,而會報錯。
基於這兩個函式的特性,當我們需要共享變數的時候,需要使用tf.get_variable()。在其他情況下,這兩個的用法是一樣的

import tensorflow as tf

with tf.variable_scope("scope1"):
    w1 = tf.get_variable("w1", shape=[])
    w2 = tf.Variable(0.0, name="w2")
with tf.variable_scope("scope1", reuse=True):
    w1_p = tf.get_variable("w1", shape=[])
    w2_p = tf.Variable(1.0, name="w2")

print(w1 is w1_p, w2 is w2_p)
#輸出
#True  False

看到這,就可以明白官網上說的引數複用的真面目了。由於tf.Variable() 每次都在建立新物件,所有reuse=True 和它並沒有什麼關係。對於get_variable(),來說,如果已經建立的變數物件,就把那個物件返回,如果沒有建立變數物件的話,就建立一個新的。

random Tensor 隨機生成tensor

可用於賦值給tf.Variable()的第一個引數

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
按正態分佈隨機生成數。shape:形狀;mean:均值;stddev:標準差。seed:隨機數種子,一個python整數。

tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None) 
正態分佈,但如果隨機出來的值偏離平均值超過2個標準差,那麼這個數將會被重新隨機。引數如上。

tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)
按平均分佈生成隨機數。shape:形狀;minval:最小值;maxval:最大值。

tf.random_shuffle(value, seed=None, name=None)
沿著要被洗牌的張量的第一個維度,隨機打亂。
random_shuffle(
    value,# 要被洗牌的張量
    seed=None,
    name=None
)
即下面這種效果:
[[1, 2],       [[5, 6],
 [3, 4],  ==>   [1, 2],
 [5, 6]]        [3, 4]]



tf.random_crop(value, size, seed=None, name=None)
隨機地將張量裁剪為給定的大小。 
以一致選擇的偏移量將一個形狀 size 部分從 value 中切出。需要的條件:value.shape >= size。

如果大小不能裁剪,請傳遞該維度的完整大小。例如,可以使用 size = [crop_height, crop_width, 3] 裁剪 RGB 影象。

引數:
value:向裁剪輸入張量。
size:一維張量,大小等級為 value。
seed:Python 整數。用於建立一個隨機的種子。檢視 tf.set_random_seed 的行為。
name:此操作的名稱(可選)。
返回:
與 value 具有相同的秩並且與 size 具有相同形狀的裁剪張量。


tf.multinomial(logits, num_samples, seed=None, name=None)
logits 大小為[batch,n_class] 
num_samples 表示取樣的個數 
seed 隨機種子數 
name表示該op的名字

這個函式就是根據logits中每個類別的概率取樣,這個概率可以不用歸一化後的概率,也就是每個類的概率可以大於1,不需要所有類別概率和為1,我覺得它底層是會自動給我們歸一化的,輸出結果為[batch,num_samples]大小 
表示在每個batch_size 上取樣num_samples個數,他是根據logits中的概率來取樣的 
這個函式用在rnn的輸出中比較多,


tf.random_gamma(shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None)
按Gamma分佈產生隨機數。shape:形狀;alpha:形狀引數alpha;beta:尺度引數beta。


tf.set_random_seed(seed)
設定圖形級隨機seed。
可以從兩個seed中獲得依賴隨機seed的操作:圖形級seed和操作級seed。下面介紹如何設定圖形級別的seed。
它與操作級別seed的互動如下:
如果既沒有設定圖層級也沒有設定操作級別的seed:則使用隨機seed進行該操作。
如果設定了圖形級seed,但操作seed沒有設定:系統確定性地選擇與圖形級seed結合的操作seed,以便獲得唯一的隨機序列。
如果未設定圖形級seed,但設定了操作seed:使用預設的圖層seed和指定的操作seed來確定隨機序列。
如果圖層級seed和操作seed都被設定:則兩個seed將一起用於確定隨機序列。

initializer

在tf.get_variable()中作為initializer引數使用。

tf.constant_initializer(value=0, dtype=tf.float32)
引數:
value: python 的標量、陣列、元組、列表或者N維的numpy array。
dtype: 資料型別.
verify_shape: 是否驗證value的shape和指定shape相符,若設為True則進行驗證,不相符時會丟擲異常。
例子:
value = [0, 1, 2, 3, 4, 5, 6, 7]
value = np.array(value)
value = value.reshape([2, 4])
init = tf.constant_initializer(value)
x = tf.get_variable('x', shape=[2, 4], initializer=init)

下列函式和上面功能一樣
tf.random_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32)
正態分佈初始化
tf.truncated_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32) 
截斷正態分佈生成隨機數
tf.random_uniform_initializer(minval=0, maxval=None, seed=None, dtype=tf.float32)
均勻分佈初始化
tf.uniform_unit_scaling_initializer(factor=1.0, seed=None, dtype=tf.float32)
這種方法輸入方差是常數
tf.zeros_initializer(shape, dtype=tf.float32, partition_info=None)0初始化
tf.ones_initializer(dtype=tf.float32, partition_info=None)1初始化
tf.orthogonal_initializer(gain=1.0, dtype=tf.float32, seed=None)
生成正交矩陣
  1. tf.placeholder(dtype,shape=None,name=None)

placeholder,佔位符,在tensorflow中類似於函式引數,執行時必須傳入值。
tf.placeholder經常使用在向神經網路圖中作為輸入資料的節點使用.

引數:
dtype:資料型別。常用的是tf.float32,tf.float64等數值型別。
shape:資料形狀。預設是None,就是一維值,也可以是多維,比如[2,3], [None, 3]表示列是3,行不定。
name:名稱。

import tensorflow as tf
import numpy as np
 
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
 
output = tf.multiply(input1, input2)
 
with tf.Session() as sess:
    print sess.run(output, feed_dict = {input1:[3.], input2: [4.]})