2016-12-27 99 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) 

应该还是运行方式相同,但经过一段时间,如果你尝试分批培训,而不是单一的样本。