现在我正在用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))
答案 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等的大波动。