2017-12-21 17 views
0

TensorFlowを使って単純な線形回帰を計算すると、w、b、lossを含む[nan]が得られます。ここでTensorFlowを使って単純な線形回帰を計算すると、なぜ[nan]が得られますか?

は私のコードです:

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

あなたはこのような高い学習率(あなたの場合は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() 
+0

私のデータを1000で割ると、それは働くことができます。しかし、それは以前にはうまくいかなかったのですか? –

+0

これは主に1000が何の情報も提供しておらず、大きな学習率でフロートオーバーフローを起こしていたからです。このおもちゃの例でも、値を正規化するのがどのように良いかを示しています。 – user3217278

1

これは、私は信じている説明を与える:

[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の値を "過剰修正":

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

は、次のような結果になります反復ごとに(絶対値が大きくなるにつれて負と正の間で振動するのを見てください)。何かが無限に達するまで、より高い値と高い値が得られ、これはNan値を生成します。単に学習率を下げる(たくさん)。

+0

私は学習率を0.00000001にしますが、それもナンです。 –

+0

0.000000001は、バイアスがあまりにもゆっくりと収束しますが、私のために働きます。それは@ user3217278の答えと一貫しています。彼は入力を10³で割っています。これは典型的なMSEを106で除算します。もし私たちがそれをしなければ、私たちは彼のLRを106で分けるべきです。 – gdelab

関連する問題