2016-12-27 20 views
6

我從例子中善於學習TensorFlow:https://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/2_BasicModels/linear_regression.ipynbTensorFlow:tf.placeholder和tf.Variable - 爲什麼不需要該維度?

我在下面的代碼中的幾個問題: 當定義佔位符和變量,如X,Y,W,和b,爲什麼沒有我們需要指定它們的維度?代碼如何分配內存而不知道這些佔位符/變量的大小?謝謝!

# tf Graph Input 
    X = tf.placeholder("float") 
    Y = tf.placeholder("float") 

    # Set model weights 
    W = tf.Variable(rng.randn(), name="weight") 
    b = tf.Variable(rng.randn(), name="bias") 


    # Construct a linear model 
    pred = tf.add(tf.mul(X, W), b) 

回答

6

TensorFlow的tf.placeholder()張量不要求你指定的形狀,爲了讓您送不同形狀的張量在以後的tf.Session.run()電話。默認情況下,佔位符的形狀完全不受限制,但可以通過傳遞可選的shape參數來限制它。例如:

w = tf.placeholder(tf.float32)      # Unconstrained shape 
x = tf.placeholder(tf.float32, shape=[None, None]) # Matrix of unconstrained size 
y = tf.placeholder(tf.float32, shape=[None, 32]) # Matrix with 32 columns 
z = tf.placeholder(tf.float32, shape=[128, 32])  # 128x32-element matrix 

當您創建佔位符時,TensorFlow不會分配任何內存。相反,當您提供佔位符時,在調用tf.Session.run()時,TensorFlow將爲輸入(隨後爲任何必需的中間值)分配適當大小的內存。

請注意,tf.Variable對象通常在創建時需要形狀,並且此形狀是從第一個參數推斷到初始值設定項的。在您的程序中,rng.randn()numpy.random.randn()的別名)將返回標量值,因此變量Wb將具有標量形狀。

儘管在你的代碼(XY)有不受約束的形狀,一些運營商,如tf.add()tf.mul(),有關於他們的論據形狀的附加要求(即他們與NumPy broadcasting rules兼容)的佔位符。由於TensorFlow不知道何時建立圖表的實際形狀,它相信用戶知道他們在做什麼,並動態執行檢查(在調用tf.Session.run()期間)。相反,如果您限制佔位符的形狀,則可以先啓用TensorFlow執行一些檢查,然後執行此操作可以幫助減少錯誤。

+0

謝謝!可變情況如何? – Edamame

+0

剛纔看到你也在問這個......我更新了答案來解釋。 – mrry

+0

當我讀取代碼在https://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/2_BasicModels/linear_regression.ipynb在我看來,變量W是一個數組,而不是標量。我理解錯了嗎?謝謝! – Edamame

相關問題