1. 程式人生 > >TensorFlow語法--Variable與placeholder的區別

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)時指定,主要用於輸入樣本。

參考

http://blog.csdn.net/u014546828/article/details/77962104