TensorFlow語法--Variable與placeholder的區別
1. Variable
定義可以從如下程式碼看。
import tensorflow as tf
# Create a variable. 注意Variable(...)是一個類,下面的placeholder(...)是一個函式
w = tf.Variable(<initial-value>, name=<optional-name>)
# Use the variable in the graph like any Tensor.
y = tf.matmul(w, ...another variable or tensor...)
# The overloaded operators are available too.
z = tf.sigmoid(w + y)
# Assign a new value to the variable with `assign()` or a related method.
w.assign(w + 1.0)
w.assign_add(1.0)
本質也是一個tensor張量,但variable主要用於資料儲存(當作C語言的全域性變數也不是不可以^^)
Variable 用於構建一個變數,在計算圖的運算過程中,其值會一直儲存到程式執行結束,而一般的tensor張量在tensorflow執行過程中只是在計算圖中流過,並不會儲存下來。
因此Varibale主要用來儲存tensorflow構建的一些結構中的引數,這些引數才不會隨著運算的消失而消失,才能最終得到一個模型。
比如神經網路中的權重和bias等,在訓練過後,總是希望這些引數能夠儲存下來,而不是直接就消失了,所以這個時候要用到Variable。
注意,所有和varible有關的操作在計算的時候都要使用session會話來控制
import tensorflow as tf
a=tf.Variable(1)
b=tf.constant(1) #定義變數a=0和常量1,並且定義a的自加運算aplus1和更新a的值得操作update"""
aplus1=tf.add(a,b)
update=tf.assign(a,aplus1)
#設定完變數之後,必須要對變數進行初始化工作,變數才能使用
init=tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init) #執行初始化變數的計算
for i in range(10): #迴圈10次,檢視a逐漸自加1的結果
sess.run(update) #執行變數a的自加運算
print(sess.run(a)) #列印變數a也需要用session.run
placeholder
定義
tf.placeholder(
dtype,
shape=None,
name=None
)
引數:
dtype: 被填充的張量的元素型別。比如最常見的float32。
shape: 可選引數。比如要1024x1024矩陣,可以這麼定義:x = tf.placeholder(tf.float32, shape=(1024, 1024))。
name: 可選引數。A name for the operation。
placeholder也是一個tenser,只能在圖計算時,Session.run(), Tensor.eval(), or Operation.run(),用feed_dict的字典喂資料。
Important: This tensor will produce an error if evaluated. Its value must be fed using the feed_dict optional argument to Session.run(), Tensor.eval(), or Operation.run().
舉例:
import tensorflow as tf
x = tf.placeholder(tf.float32, shape=(1024, 1024))
y = tf.matmul(x, x)
with tf.Session() as sess:
print(sess.run(y)) # ERROR: will fail because x was not fed.
rand_array = np.random.rand(1024, 1024)
print(sess.run(y, feed_dict={x: rand_array})) # Will succeed.
再舉個同時使用2個placeholder的例子。
import tensorflow as tf
#placeholder測試
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
# output = tf.multiply(input1,input2)#乘法
# output = tf.add(input1,input2)#加法
# output = tf.mod(input1,input2)#餘數
# output = tf.sub(input1,input2)#減發
output = tf.div(input1,input2)#除法
with tf.Session() as sess:
print(sess.run(output,feed_dict={input1:[7.],input2:[2.]}))
總結
如果上面扯淡那麼久還是不明白,可以這麼想。假設我們要找到一個線性函式
y = w0 * x + w1,有一堆樣本資料(X, Y), 訓練的目標是(w0, w1),則樣本資料,需要建立placeholder,然後喂資料給placeholder,需要建立variable,來更新迭代(w0, w1)。
variable必須初始化,主要用於存訓練變數,如模型的權重,偏差。placeholder不用初始化,在session.run(xx, feed_dict)時指定,主要用於輸入樣本。