二者的主要區別在於

Variable:主要是用於訓練變數(trainable variables)之類的。比如我們經常使用的網路權重,偏置。 
值得注意的是Variable在宣告是必須賦予初始值。在訓練過程中該值很可能會進行不斷的加減操作變化。 
名稱的真實含義,在於變數,也即在真實訓練時,其值是會改變的,自然事先需要指定初始值;
 

weights = tf.Variable(
    tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
            stddev=1./math.sqrt(float(IMAGE_PIXELS)), name='weights')
)
biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')
  • 宣告時,若設定引數trainable=False,那麼引數不會被改變,預設trainable=True;

placeholder: 用於得到傳遞進來的真實的訓練樣本

此函式可以理解為形參,用於定義過程,在執行的時候再賦具體的值

  • 不必指定初始值,可在執行時,通過 Session.run 的函式的 feed_dict 引數指定;
  • 也是用於儲存資料,但是主要用於feed_dict的配合,接收輸入資料用於訓練模型等。placeholder值在訓練過程中會不斷地被賦予新的值,用於批訓練,基本上其值是不會輕易進行加減操作。

placeholder在命名時是不會需要賦予值得,其被賦予值得時間實在feed_dict時。其命名的原因所在,僅僅作為一種佔位符;

tf.placeholder(dtype, shape=None, name=None)

此函式可以理解為形參,用於定義過程,在執行的時候再賦具體的值

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

images_placeholder = tf.placeholder(tf.float32, shape=[batch_size, IMAGE_PIXELS])
labels_placeholder = tf.placeholder(tf.int32, shape=[batch_size])