在这个例子中,如何通过tensorflow进行回归?

时间:2017-11-21 12:23:37

标签: python tensorflow regression

我使用tensorflow进行线性回归。我在这里面临一个问题:

import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (8,6)

data = pd.read_csv('./data.csv')
xs = data["A"][:100]
ys = data["B"][:100]

X = tf.placeholder(tf.float32, name='X')
Y = tf.placeholder(tf.float32, name='Y')

W = tf.Variable(tf.random_normal([1]),name = 'weight')
b = tf.Variable(tf.random_normal([1]),name = 'bias')

Y_pred = tf.add(tf.multiply(X,W), b)

sample_num = xs.shape[0]
loss = tf.reduce_sum(tf.pow(Y_pred - Y,2))/sample_num
learning_rate = 0.0001
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

n_samples = xs.shape[0]
init = tf.global_variables_initializer()
with tf.Session() as sess:

    sess.run(init)

    for i in range(100):
        for x,y in zip(xs,ys):
            _, l = sess.run([optimizer, loss], feed_dict={X: x, Y:y})

    W, b = sess.run([W, b])

plt.plot(xs, ys, 'bo', label='Real data')
plt.plot(xs, xs*W + b, 'r', label='Predicted data')
plt.legend()
plt.show()

data.csv是here

情节与我的预期截然相反: enter image description here 那么,问题是什么?我是python和tensorflow的初学者,只是无法达到分数。

2 个答案:

答案 0 :(得分:1)

由于您的学习率和时期数太少,您的回归模型尚未收敛。因此,您可能需要提高学习率并使用 tf.train.AdamOptimizer

这里我将学习率设置为2,epochs = 10000并得到以下图表。

enter image description here

在这里,我已经在必要时给出了带有注释的代码。

import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt

plt.rcParams["figure.figsize"] = (8, 6)

data = pd.read_csv('./data.csv')
xs = data["A"][:100]
ys = data["B"][:100]

X = tf.placeholder(tf.float32, name='X')
Y = tf.placeholder(tf.float32, name='Y')

W = tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

Y_pred = tf.add(tf.multiply(X, W), b)

loss = tf.reduce_mean(tf.pow(Y_pred - Y, 2))
learning_rate = 2 #increase the learning rate
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss)#use the AdamOptimizer

BATCH_SIZE = 8 #Batch Size define here

n_samples = xs.shape[0]
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)

    for i in range(10000): #increase the num of epoches
        for start, end in zip(range(0, n_samples, BATCH_SIZE), # mini batch Gradientdecent
                              range(BATCH_SIZE, n_samples + 1, BATCH_SIZE)):
            _, l = sess.run([optimizer, loss], feed_dict={X: xs[start:end], Y: ys[start:end]})

    prediction = sess.run(Y_pred, feed_dict={X: xs})
    #W, b = sess.run([W, b])

plt.plot(xs, ys, 'bo', label='Real data')
plt.plot(xs, prediction, 'r', label='Predicted data')
plt.legend()
plt.show()

此外,您可以使用迷你批量渐变方法来加速收敛,如上面的代码。

此外,您可以进一步增加时代数和学习率,以获得最佳结果。

希望这有帮助。

答案 1 :(得分:1)

正如Nipun所提到的,请尝试使用AdamOptimizer代替GradientDescentOptimizer

您经常会发现AdamOptimizer通常是比GradientDescentOptimizer更好的优化程序,并且更快地达到最小值。

它是通过调整学习率而不是保持不变来实现的(在你的情况下0.0001)。

此外,更多的时期,更好的模型(不考虑过度拟合)。