Python 为什么在使用TensorFlow计算简单线性回归时得到[nan]?

Python 为什么在使用TensorFlow计算简单线性回归时得到[nan]?,python,tensorflow,machine-learning,linear-regression,Python,Tensorflow,Machine Learning,Linear Regression,当我使用TensorFlow计算一个简单的线性回归时,我得到[nan],包括:w,b和损失 这是我的密码: import tensorflow as tf w = tf.Variable(tf.zeros([1]), tf.float32) b = tf.Variable(tf.zeros([1]), tf.float32) x = tf.placeholder(tf.float32) y = tf.placeholder(tf.float32) liner = w*x+b loss =

当我使用TensorFlow计算一个简单的线性回归时,我得到[nan],包括:w,b和损失

这是我的密码:

import tensorflow as tf

w = tf.Variable(tf.zeros([1]), tf.float32)
b = tf.Variable(tf.zeros([1]), tf.float32)
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)

liner = w*x+b

loss = tf.reduce_sum(tf.square(liner-y))

train = tf.train.GradientDescentOptimizer(1).minimize(loss)

sess = tf.Session()

x_data = [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000]
y_data = [265000, 324000, 340000, 412000, 436000, 490000, 574000, 585000, 680000]                                                    

sess.run(tf.global_variables_initializer())

for i in range(1000):
    sess.run(train, {x: x_data, y: y_data})

nw, nb, nloss = sess.run([w, b, loss], {x: x_data, y: y_data})

print(nw, nb, nloss)
输出:

[ nan] [ nan] nan

Process finished with exit code 0

为什么会发生这种情况,我该如何解决呢?

使用如此高的学习率(在您的案例中为1),您的学习效率已经非常高了。尝试使用0.001的学习率。此外,您的数据需要除以1000,迭代次数也需要增加,这样才能正常工作。这是我测试过的代码,工作非常完美

x_data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y_data = [265, 324, 340, 412, 436, 490, 574, 585, 680]

plt.plot(x_data, y_data, 'ro', label='Original data')
plt.legend()
plt.show()

W = tf.Variable(tf.random_uniform([1], 0, 1))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b

loss = tf.reduce_mean(tf.square(y - y_data))

optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)
init = tf.initialize_all_variables()

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

for step in range(0,50000):
   sess.run(train)
   print(step, sess.run(loss))
print (step, sess.run(W), sess.run(b))

plt.plot(x_data, y_data, 'ro')
plt.plot(x_data, sess.run(W) * x_data + sess.run(b))
plt.legend()
plt.show()

你使用如此高的学习率(在你的情况下是1)让你感到心满意足。尝试使用0.001的学习率。此外,您的数据需要除以1000,迭代次数也需要增加,这样才能正常工作。这是我测试过的代码,工作非常完美

x_data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y_data = [265, 324, 340, 412, 436, 490, 574, 585, 680]

plt.plot(x_data, y_data, 'ro', label='Original data')
plt.legend()
plt.show()

W = tf.Variable(tf.random_uniform([1], 0, 1))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b

loss = tf.reduce_mean(tf.square(y - y_data))

optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)
init = tf.initialize_all_variables()

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

for step in range(0,50000):
   sess.run(train)
   print(step, sess.run(loss))
print (step, sess.run(W), sess.run(b))

plt.plot(x_data, y_data, 'ro')
plt.plot(x_data, sess.run(W) * x_data + sess.run(b))
plt.legend()
plt.show()

这就是我相信的解释:

for i in range(10):
     print(sess.run([train, w, b, loss], {x: x_data, y: y_data}))
给出以下结果:

[None, array([  4.70380012e+10], dtype=float32), array([ 8212000.], dtype=float32), 2.0248419e+12] 
[None, array([ -2.68116614e+19], dtype=float32), array([ -4.23342041e+15], dtype=float32),
6.3058345e+29] 
[None, array([  1.52826476e+28], dtype=float32), array([  2.41304958e+24], dtype=float32), inf] [None, array([
-8.71110858e+36], dtype=float32), array([ -1.37543819e+33], dtype=float32), inf] 
[None, array([ inf], dtype=float32), array([ inf], dtype=float32), inf]

您的学习率太高,因此您在每次迭代时都“过度校正”了
w
的值(请参见它在负和正之间振荡,绝对值不断增加)。你得到越来越高的值,直到某物达到无穷大,这就产生了Nan值。只是降低(很多)学习率。

这就是我认为的原因:

for i in range(10):
     print(sess.run([train, w, b, loss], {x: x_data, y: y_data}))
给出以下结果:

[None, array([  4.70380012e+10], dtype=float32), array([ 8212000.], dtype=float32), 2.0248419e+12] 
[None, array([ -2.68116614e+19], dtype=float32), array([ -4.23342041e+15], dtype=float32),
6.3058345e+29] 
[None, array([  1.52826476e+28], dtype=float32), array([  2.41304958e+24], dtype=float32), inf] [None, array([
-8.71110858e+36], dtype=float32), array([ -1.37543819e+33], dtype=float32), inf] 
[None, array([ inf], dtype=float32), array([ inf], dtype=float32), inf]

您的学习率太高,因此您在每次迭代时都“过度校正”了
w
的值(请参见它在负和正之间振荡,绝对值不断增加)。你得到越来越高的值,直到某物达到无穷大,这就产生了Nan值。只是降低(很多)学习率。

当我将数据除以1000时,它可以工作。但是为什么以前不工作呢?呃,这主要是因为1000没有提供任何信息,并且让你的学习率过大,导致浮动溢出。即使在这个玩具示例中,它也显示了规范化值的好处。当我将数据除以1000时,它可以工作。但是为什么它以前不工作呢?呃,这主要是因为1000没有提供任何信息,并且让你的学习速度过快,导致浮点溢出。即使在这个玩具示例中,它也显示了规范化您的值是多么好。0.000000001对我有效,尽管偏差收敛得太慢。这与@user3217278的答案一致:他将输入除以10³,这将把典型的MSE除以10⁶; 所以如果我们不这样做,我们应该把他的LR除以10⁶.0.000000001对我有效,尽管偏差收敛太慢。这与@user3217278的答案一致:他将输入除以10³,这将把典型的MSE除以10⁶; 所以如果我们不这样做,我们应该把他的LR除以10⁶.