在tensorflow中,變數(variable)是特殊的張量(tensor),它的值可以是乙個任何型別和形狀的張量。
與其他張量不同,變數存在於單個 session.run 呼叫的上下文之外,也就是說,變數儲存的是持久張量,當訓練模型時,用變數來儲存和更新引數。除此之外,在呼叫op之前,所有變數都應被顯式地初始化過。
1.建立變數
最常見的建立變數方式是使用variable()建構函式。
import tensorflow as tf
v = tf.variable([1,2,3]) #建立變數v,為乙個array
print(v) #檢視v的shape,不是v的值。結果是:
with tf.session() as sess:
sess.run(v.initializer) #執行變數的initializer。呼叫op之前,所有變數都應被顯式地初始化過。
sess.run(v) #檢視v的值,結果是:array([1, 2, 3])
除了我們自己填寫變數的值外,一般可以使用tensorflow提供了一系列操作符來初始化張量,初始值是常量或是隨機值。
r = tf.variable(tf.random_normal([20, 10], stddev=0.35)) #以標準差0.35的正太分布初始化乙個形狀為[20,40]的張量
z = tf.variable(tf.zeros([20])) #初始化乙個形狀為[20]的張量, 裡面的元素值全部為0.
類似的函式還有tf.eye, tf.ones,tf.constant等。
建立變數還可以呼叫 tf.get_variable 函式。此函式要求您指定變數的名稱。此名稱將被其他副本用來訪問同一變數,以及在檢驗和匯出模型時命名此變數的值。tf.get_variable 還允許您重用先前建立的同名變數,從而輕鬆定義重用層的模型。
要使用 tf.get_variable 建立變數,只需提供名稱和形狀即可
my_variable = tf.get_variable("my_variable", [1, 2, 3]) #這將建立乙個名為「my_variable」的變數,該變數是形狀為 [1, 2, 3] 的三維張
變數的初始化必須在模型的其它操作執行之前先明確地完成。如果您在低級別 tensorflow api 中進行程式設計(即顯式建立自己的圖和會話),則必須明確初始化變數。tf.contrib.slim、tf.estimator.estimator 和 keras 等大多數高階框架在訓練模型前會自動初始化變數。
那麼在低級別api裡面,最簡單的方法就是新增乙個給所有變數初始化的操作(比如tf.global_variables_initializer()),並在使用模型之前首先執行那個操作。
with tf.session() as sess:
sess.run(tf.global_variables_initializer()) #執行變數的initializer。呼叫op之前,所有變數都應被顯式地初始化過。
sess.run(v) #檢視v的值,結果是:array([1, 2, 3])
除此之外,還有前面所提到的單個變數的初始化(v.initializer)。
系統定義initializer為變數初始化的方法,初始化有如下幾種:
tf.constant_initializer(value=0, dtype=tf.float32):常量初始化
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.zeros_initializer(shape, dtype=tf.float32, partition_info=none):全0常量初始化
tf.ones_initializer(dtype=tf.float32, partition_info=none):全1常量初始化
tf.uniform_unit_scaling_initializer(factor=1.0, seed=none, dtype=tf.float32):均勻分布(不指定最小、最大值)初始化
tf.variance_scaling_initializer(scale = 1.0, mode = "fan_in", distribution = "normal", seed = none, dtype = dtypes.float32):由mode確定數量的擷取的正態分佈或均勻分
tf.orthogonal_initializer(gain=1.0, dtype=tf.float32, seed=none):正交矩陣初始化
tf.glorot_uniform_initializer(seed=none, dtype=tf.float32):由輸入單元節點數和輸出單元節點數確定的均勻分布初始化
tf.glorot_normal_initializer(seed=none, dtype=tf.float32):由輸入單元節點數和輸出單元節點數確定的擷取的正態分佈初始化
note: tf.get_variable中initializer的初始化不需要指定shape了,已在外面指定
**: TensorFlow學習(2) 變數
在tensorflow中,變數 variable 是特殊的張量 tensor 它的值可以是乙個任何型別和形狀的張量。與其他張量不同,變數存在於單個 session.run 呼叫的上下文之外,也就是說,變數儲存的是持久張量,當訓練模型時,用變數來儲存和更新引數。除此之外,在呼叫op之前,所有變數都應被...
Tensorflow學習筆記2
參考 1 classification分類學習 from tensorflow.examples.tutorials.mnist import input data mnist input data.read data sets mnist data one hot true mnist庫是手寫體數...
tensorflow入門筆記(2)
在tensorflow中,變數 tf.variable 的作用是儲存和更新神經網路中的引數。一般來說,權重引數 weights 賦予隨機初始值最為常見。偏置項常常用常數來設定初始值 import tensorflow as tf weights為乙個2 3的矩陣,初始值為正態分佈隨機數,標準差而2,...