2017-05-28 129 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

相关问题