TensorFlow LinearRegressor contrib.learn预测与手动训练预测结果不匹配

时间:2017-06-10 07:19:30

标签: tensorflow

我是tensorflow的新手,我刚刚通过GetStarted页面+教程: https://www.tensorflow.org/get_started/get_started

使用tf.contrib.learn示例,我稍微改变了y,但为了简单起见,仍保留了一条完美的直线。但是,当我要求估算器进行预测时,我没有得到我预期的结果+当我不使用tf.contrib.learn时得到的预测结果,我希望有人可以解释其中的差异。

tf.contrib.learn

使用tf.contrib.learn我得到预测结果= [9.84994888 11.78239346 13.71483707]我期待它更接近10,12,14

import tensorflow as tf
import numpy as np

features = [tf.contrib.layers.real_valued_column("x", dimension=1)]
estimator = tf.contrib.learn.LinearRegressor(feature_columns=features)

x = np.array([1., 2., 3., 4.])
y = np.array([2., 4., 6., 8.])
input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4, num_epochs=1000)

estimator.fit(input_fn=input_fn, steps=1000)

print(estimator.evaluate(input_fn=input_fn))

print(np.asarray([i for i in estimator.predict(x={'x': np.array([5., 6., 7.])})]))

根据TensorFlow入门页面手动培训

手动训练,我的预测结果= [10. 12. 14.],这自然是我所期待的。

import tensorflow as tf

sess = tf.Session()

W = tf.Variable([2.], tf.float32)
b = tf.Variable([0.], tf.float32)
x = tf.placeholder(tf.float32)
linear_model_y_result = W * x + b

init = tf.global_variables_initializer()
sess.run(init)

y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model_y_result - y)
loss = tf.reduce_sum(squared_deltas)
print(sess.run(loss, {x:[1.,2.,3.,4.], y:[2.,4.,6.,8.]}))

y_ = tf.multiply(x, W)

optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

x_train = [1.,2.,3.,4.]
y_train = [2.,4.,6.,8.]

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(1000):
  sess.run(train, {x:x_train, y:y_train})

pred_y = sess.run(y_, {x:[5.,6.,7.]})

print(pred_y)

如果有人可以向我解释差异以及为什么/或者我缺少什么需要添加以便让tf.contrib.learn获得完全适合的预测结果(我认为他们应该为此简单的例子)。

由于

1 个答案:

答案 0 :(得分:0)

如果在未指定所需优化程序的情况下调用`<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetCitiesByCountryResponse xmlns="http://www.webserviceX.NET"><GetCitiesByCountryResult>&lt;NewDataSet&gt; &lt;Table&gt; &lt;Country&gt;British Indian Ocean Territory&lt;/Country&gt; &lt;City&gt;Diego Garcia&lt;/City&gt; &lt;/Table&gt; &lt;Table&gt; &lt;Country&gt;India&lt;/Country&gt; &lt;City&gt;Ahmadabad&lt;/City&gt; &lt;/Table&gt; &lt;Table&gt; &lt;Country&gt;India&lt;/Country&gt; &lt;City&gt;Akola&lt;/City&gt; &lt;/Table&gt; &lt;Table&gt; &lt;Country&gt;India&lt;/Country&gt; &lt;City&gt;Aurangabad Chikalthan Aerodrome&lt;/City&gt; &lt;/Table&gt; &lt;Table&gt; ` ,它将使用Ftrl优化程序(https://www.tensorflow.org/api_docs/python/tf/contrib/learn/LinearRegressor)。如果要使用渐变下降优化器,可以使用

tf.contrib.learn.LinearRegressor

应预测[9.98047733 11.97054482 13.9606123]。虽然这仍然不如手动培训那么好,但使用相同的优化器证明已经好多了。 tf.contrib.learn.LinearRegressor(feature_columns=features, optimizer = tf.train.GradientDescentOptimizer(0.01))的示例仍然会给出一些警告(至少在我的机器上),所以如果您设法摆脱这些警告,结果可能会相同。