2017-05-28 106 views
0

我一直在閱讀有關張量流動的指南:https://medium.com/all-of-us-are-belong-to-machines/the-gentlest-introduction-to-tensorflow-248dc871a224爲什麼線性迴歸佔位符在張量流中具有形狀[1,1]?

...而且大多數情況下,我看到發生了什麼。

然而,在example code線性模型限定所述線性模型是這樣的:

# Model linear regression y = Wx + b 
x = tf.placeholder(tf.float32, [None, 1]) 
W = tf.Variable(tf.zeros([1,1])) 
b = tf.Variable(tf.zeros([1])) 
product = tf.matmul(x,W) 
y = product + b 
y_ = tf.placeholder(tf.float32, [None, 1]) 

# Cost function sum((y_-y)**2) 
cost = tf.reduce_mean(tf.square(y_-y)) 

# Training using Gradient Descent to minimize cost 
train_step = tf.train.GradientDescentOptimizer(0.0000001).minimize(cost) 

的問題是:爲什麼Wx + b與這些值表示:

x = tf.placeholder(tf.float32, [None, 1]) 
W = tf.Variable(tf.zeros([1,1])) 
b = tf.Variable(tf.zeros([1])) 

[None, 1][1, 1]?爲什麼[None, 1]爲x和[1, 1]爲W?

如果[1, 1]是大小爲1的1個元素,那麼爲什麼b只是[1],這是什麼意思? 1個大小爲0的元素?

對於W = tf.Variable,第一個'1'是特徵,房屋大小,第二'1'是輸出房價。

這是否意味着,如果我試圖表現的模型,說:

y = Ax + Bz 

這意味着我有兩個「功能」(x和z)和我的A和B值應形[2,1]?這看起來不正確...

這似乎完全不同於polynomial regression,其中權重因子是形狀[1]。爲什麼這是不同的?

回答

1

我想,也許你應該學會像線性代數。

讓我們從這條線開始# Model linear regression y = Wx + b這是您發佈的代碼中的第一行。實際上,這意味着兩個矩陣運算。

第一個是Wx,表示矩陣X矩陣乘以x。對你來說,意味着:

[x11, x21, x31, ..., xn1]T * [w] = [x11*w, x21*w, x31*w, ..., xn1*w]T 

WxR(結果),我們可以重寫Wx + BR + B。這是第二個矩陣操作。對你來說,意味着:

[x11*w, x21*w, x31*w, ..., xn1*w]T + [b] = [x11*w + b, x21*w + b, x31*w + b, ..., xn1*w + b]T 

所以,如果你在你輸入一個以上的功能,並且要輸出多個結果,模型的定義應該是:

x = tf.placeholder(tf.float32, [None, your_input_features]) 
W = tf.Variable(tf.zeros([your_input_features, your_output_features])) 
b = tf.Variable(tf.zeros([your_output_features])) 
product = tf.matmul(x,W) 
y = product + b 
+0

這就是文章所說的!我問的問題是*爲什麼*。這是另一種解決方案,不會*做到這一點:https://raw.githubusercontent.com/pkmital/tensorflow_tutorials/master/python/02_linear_regression.py你爲什麼要做這個*而不是*那*。 – Doug

+1

@Doug實際上,如果您只有一個輸入功能和一個輸出功能,則這兩種解決方案之間沒有區別。但是發佈在您的問題中的解決方案可以很容易地修改爲用於多個輸入功能和多個輸出功能的情況。 – Sraw

+0

@Doug換句話說,它更可能是一個關於編碼的問題,而不是模型的結構。 – Sraw

0

原作者應該選擇[1, 1]的形狀,因爲她/他想要比普通標量產品更普遍的功能。

這樣,您可以將形狀更改爲[1, d]以具有每個樣本的d功能。

那麼當然也應該將x的形狀改爲d

+0

爲什麼你想d功能來建模'Wx + b'?爲什麼當b是'[1]'時W' [1,1]'? – Doug

0

您是否熟悉線性代數?

形狀佔位符[None,1]表示無限制行和1列。 shape [1,1]的佔位符表示1行1列。

形狀[1,1]和[1]是在這個意義上不同:

  • [1] => PLH = [X]
  • [1,1] => PLH = [[ x]]

然後tf.matmul計算點積:xW並加上b。 爲了使張量流動起作用,張量必須具有相似的形狀,這就是爲什麼W的形狀[1,1]而不僅僅是[1]。

讓我們:

  • X = [[1],[2],[3]]
  • W = [[10]]
  • B = [[9],[ 8],[7]]

然後:

  • tf.matmul(X,W)= [[10],[20],[30]]
  • tf.matmul(X,W)+ B = [[19],[28],[27]]

我希望這回答你的問題

+0

當xs = np.array([[i]])時,x [[1],[2],[3]]如何? sess.run(train_step,feed_dict = {x:xs,y_:ys}})'? (顯然不是)。爲什麼這是必要的?爲什麼不把它建模爲像Y_pred = tf.add(tf.multiply(X,W),b)這樣的線性運算? – Doug