2017-01-12 1 views
0
import tensorflow as tf 

x = tf.placeholder(tf.float32, [None, 1]) 
y = tf.placeholder(tf.float32, [None, 1]) 

w = tf.Variable(tf.zeros([1, 1], tf.float32)) 
# b = tf.Variable(tf.random_uniform([1, 1], -1, 1)) 
hypothesis = tf.nn.softmax(tf.matmul(x, w)) 
cost = tf.reduce_mean(-tf.reduce_sum(hypothesis* tf.log(y), reduction_indices=[1])) 
train = tf.train.GradientDescentOptimizer(0.001).minimize(cost) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    for i in range(5000): 
     #print (sess.run(w)) 
     sess.run(train, feed_dict={x:x_, y:y_}) 
    print (sess.run(w)) 

Mein Quellcode geben ist wie oben kann ich nicht verstehen, warum Ergebnis NAN ist.
Ich bin Anfänger in diesem Tensorflow und Machine Learning-Bereich.
Ich denke, dass mein Quellcode richtig ist. Bitte sag mir, wenn es falsch ist.Warum fließen Tensor nan statt Zahl

Antwort

0

Ohne Ihre x_ Werte zu sehen, ist es schwierig, sicher zu wissen. Aber eine fundierte Schätzung ist die tf.log op, die Sie erhalten, Null oder negative Eingänge. Also statt

cost = tf.reduce_mean(-tf.reduce_sum(hypothesis* tf.log(y), reduction_indices=[1])) 

etwas Versuchen Sie, wie

cost = tf.reduce_mean(-tf.reduce_sum(hypothesis* tf.log(tf.clip_by_value(y, 1e-8, 1.0)), reduction_indices=[1])) 

auch erwähnenswert, dass ab Version 1.0.0-alpha TensorFlow einen speziellen Debugger hat, die diese Art von Fragen hilft die Diagnose, unter anderem. Siehe: https://www.tensorflow.org/versions/master/how_tos/debugger/

Um es auszuprobieren, nach Ihrer Linie sess.run(init) hinzufügen.

from tensorflow.python import debug as tf_debug 
sess = tf_debug.LocalCLIDebugWrapperSession(sess) 
sess.add_tensor_filter("has_inf_or_nan", tf_debug.has_inf_or_nan) 

In der Befehlszeilenschnittstelle, die auf dem nächsten sess.run Aufruf erscheint.

tfdbg> run -f has_inf_or_nan 
0

Sieht aus wie Sie versuchen eine einfache logistische Regression, aber die Variablen sind alle durcheinander.

Zunächst wird die Kreuzentropie muss sein:

y*tf.log(hypothesis) 

nicht umgekehrt. Zweitens muss y von Ihren Datenetiketten abgetastet werden - etwas, das Sie nicht tun. x_ und y_ fehlen. Es ist schwer zu debuggen, ohne all diese zwei Probleme zu korrigieren.