【问题标题】:How to do the regression by tensorflow in this example?在这个例子中如何通过 tensorflow 进行回归?
【发布时间】:2018-05-04 21:56:23
【问题描述】:

我正在使用 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

情节与我的预期截然相反: 那么,问题是什么?我是python和tensorflow的初学者,就是达不到重点。

【问题讨论】:

  • 你试过提高学习率吗? 0.0001 相当小。你得到什么样的损失值?
  • @Sunreef 我试图提高学习率,但变量“W”、“b”和“损失”将变为“无”。不会绘制预测数据。我不知道是什么问题。
  • @Sunreef 我的tensorflow是pip安装的,总是显示很多警告。这些会影响结果吗?

标签: python tensorflow regression


【解决方案1】:

正如 Nipun 所说,尝试使用 AdamOptimizer 而不是 GradientDescentOptimizer

您会经常发现AdamOptimizer 通常比GradientDescentOptimizer 更好,并且可以更快地达到最小值。

它通过调整学习率而不是保持恒定来实现这一点(在您的情况下为0.0001)。

此外,epoch 数越多,模型越好(此处不考虑过度拟合)。

【讨论】:

    【解决方案2】:

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

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

    这里我在必要时给出了带有 cmets 的代码。

    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()
    

    另外,你可以使用小批量梯度下降法来加速收敛,如上面的代码。

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多