我的线性回归代码出了点问题

时间:2019-01-07 15:50:01

标签: python tensorflow linear-regression

现在我正在用python(tensorflow)研究线性回归,我参考了一些教程,并编写了以下代码。

因此此线性代码可以预期下一个结果(W = 2,b = 2)

但是,如果我扩展提要数据,结果将被破坏。

ex)3-> 5

x_data = [1,2,3,4,5]

y_data = [4,6,8,10,12]

排名仍为1

在形状上,每个X和Y都加2

我希望更多的数据可以提高准确性,但是结果看起来有些错误。

为什么该代码仅在下一个条件下有效

x_data = [1,2,3] y_data = [4,6,8]

import tensorflow as tf

x_data = [1,2,3]
y_data = [4,6,8]

# Try to find values for W and b that compute y_data = W*x_data + b
# (We know that W should be 1 and b 0, but tf will
# figure that out for us )

W = tf.Variable(tf.random_uniform([1], -10.0, 10.0))
b = tf.Variable(tf.random_uniform([1], -10.0, 10.0))

##### 추가 및 변경된 부분 #####

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

hypothesis = W * X + b

cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Minimize
a = tf.Variable(0.1) # Learning rate, alpha
optimizer = tf.train.GradientDescentOptimizer(a)
train = optimizer.minimize(cost)

# Before starting, initialize the variables.
# Lets run
init = tf.initialize_all_variables()

# Launch the graph
sess = tf.Session()
sess.run(init)

# Fit the line
for step in range(2001):
    sess.run(train, feed_dict={X:x_data, Y:y_data})
    if step % 20 == 0:
        print (step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W), sess.run(b))

1 个答案:

答案 0 :(得分:0)

用[1,2,3,4,5]和[4,6,8,10,12]运行脚本,我发现优化过程有所不同,并为W和b产生了“ nan”值;我认为这就是结果“中断”的意思。

主要的两个问题是步长(alpha = 0.1)非常激进,并且参数W和B的默认初始化可能不是最佳的。这始终是上下文相关的评估---没有适用于每个优化问题的alpha通用设置---因此您应该查看收敛步骤。修改脚本以在每次迭代后打印值,以下是前几个:

sonar-scanner

看看参数的变化有多大?这些参数的值最终会大幅度改变---高达350%!在这种一维情况下,参数W的最小二乘费用的梯度为

ORIGINAL VALUES: (-1, 1046.1516, array([-5.939405], dtype=float32), array([-4.5157075], dtype=float32)) OPTIMIZING (0, 1949.8801, array([15.435911], dtype=float32), array([1.5510774], dtype=float32)) (1, 3636.85, array([-13.854544], dtype=float32), array([-6.420686], dtype=float32)) (2, 6785.708, array([26.077063], dtype=float32), array([4.7761774], dtype=float32))

或等效地

D[cost]/D[W] = 2W/N * sum_i (W x_i + B - y_i)

因此,来自W和B的初始随机值(-5.9和-4.5)的初始误差(1/W D[cost]/D[W] = 2 (W <x> + B - <y>))等于-35 ---并且alpha为0.1,参数W将被更改约-350%(100%* -35 * 0.1)的分数。这就是为什么W从-5.9一直上升到15.4的原因。

因此,两个问题是: -W和B的初始值似乎很大。您可能想尝试其他初始化机制。我不知道建议的程序是什么,但是在这种情况下tf.global_variables_initializer可能不是最好的 -更重要的是,您的学习参数alpha太大。尝试较小的值,例如0.001;或使用AdamOptimizer而不是GradientDescentOptimizer尝试0.1。 AdamOptimizer应该更好地处理您看到的W从-5.9 => 15.4 => -13.8 => 26.1等的大波动。