2016-12-27 92 views
0

我從例如在學習TensorFlow:https://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/2_BasicModels/linear_regression.ipynbTensorFlow:功能reduce_sum輸入

我在下面的代碼有一個問題:

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") 
In [6]: 
# Construct a linear model 
pred = tf.add(tf.mul(X, W), b) 
In [7]: 
# Mean squared error 
cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples) 

tf.reduce_sum的輸入是tf.pow(預解碼值-Y,2))這似乎是一個標量(或者我錯了嗎?)然後我想知道爲什麼我們想要在標量上做reduce_sum?我在這裏錯過了什麼?謝謝!

回答

2

張量pred具有靜態未知的形狀,但—由於tf.add()broadcasting semanticstf.mul() —它將具有相同動態形狀作爲值饋送到佔位符X(其中也有一個靜態未知形狀)。

在教程,當模型被訓練,X被供給標量值,因此pred將是一個標量(以及tf.reduce_sum()將沒有任何效果):

# Fit all training data 
for epoch in range(training_epochs): 
    for (x, y) in zip(train_X, train_Y): 
     sess.run(optimizer, feed_dict={X: x, Y: y}) 

當產生日誌消息,X被饋送有載體(包含所有的訓練例子),所以pred也將是相同長度的矢量,並且將tf.reduce_sum()向下聚集成本爲標量:

#Display logs per epoch step 
    if (epoch+1) % display_step == 0: 
     c = sess.run(cost, feed_dict={X: train_X, Y:train_Y}) 

這個例子有點奇怪,因爲我們通常使用mini-batch的例子訓練TensorFlow模型,但它證明了允許tf.placeholder()具有靜態未定義形狀的有用性。

+0

我再次閱讀代碼。如果佔位符X是一維數組。爲什麼不能pred = tf.add(tf.mul(X,W),b)是基於Numpy廣播規則的一維數組?我的意思是在mul和add操作上應用廣播規則?謝謝! – Edamame

+0

如果'X'是一維數組,則'pred' *將是一維數組(如上面的日誌記錄情況)。然而,在'X'是標量的訓練案例中,由於'W'和'b'也是標量,'pred'將是一個標量(因爲適用於兩個標量的廣播規則是標量0。 – mrry

1

我對Tensorflow也很新,但看起來你是對的。目前訓練一次僅運行一個樣本,因此reduce_sum調用實際上是無用的。

嘗試下探調用reduce_sum以及與此替換它:

cost = tf.pow(pred-Y, 2)/(2*n_samples) 

應該還是運行方式相同,但經過一段時間,如果你嘗試分批培訓,而不是單一的樣本。