2016-06-26 11 views
1

Ich führe den folgenden Code für TensorFlow und alle Wahrscheinlichkeiten sind NaN und alle Vorhersagen sind 0. Die Genauigkeit funktioniert jedoch. Ich habe keine Ahnung, wie das zu debuggen ist. Jede und jede Hilfe wird geschätzt.Tensor Flow alle Vorhersagen sind 0

x = tf.placeholder("float", shape=[None, 22]) 
W = tf.Variable(tf.zeros([22, 5])) 

y = tf.nn.softmax(tf.matmul(x, W)) 
y_ = tf.placeholder(tf.float32, [None, 5]) 

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) 
#cross_entropy = -tf.reduce_sum(tf_softmax_correct*tf.log(tf_softmax + 1e-50)) 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 
init = tf.initialize_all_variables() 

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

for i in range(100): 
    batch_xs, batch_ys = random.sample(allTrainingArray,100), random.sample(allTrainingSkillsArray,100) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

#test on itself 
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 
print "accuracy", sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys}) 

probabilities = y 
print "probabilities", probabilities.eval(feed_dict={x: allTrainingArray}, session=sess) 

prediction=tf.argmax(y,1) 
print "predictions", prediction.eval(feed_dict={x: allTrainingArray}, session = sess) 

Antwort

0

Ich denke, Sie haben ein Problem bei der Berechnung Ihres Verlustes. Es kann auch hilfreich sein, wenn Sie einen Vektor biases hinzufügen.

Sie sollten dies versuchen:

W = tf.Variable(tf.zeros([22, 5])) # can try better initialization methods 
b = tf.Variable(tf.zeros([5])) # can try better initialization methods 
y = tf.matmul(x, W) + b 

loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(y, y_) 
) 

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 

Falls Sie schauen tf.nn.softmax_cross_entropy_with_logits

5

Das Problem ergibt sich aus dieser Zeile im Code:

W = tf.Variable(tf.zeros([22, 5])) 

Ihre Gewichte auf Null initialisieren ist ein häufiger Fehler beim Definieren eines neuronalen Netzwerks. This article erklärt die Begründung dahinter (sehr ungefähr, alle Neuronen haben den gleichen Wert, so dass das Netzwerk nicht lernen wird). Stattdessen sollten Sie Ihre Gewichte zu kleinen Zufallszahlen initialisieren, und ein typisches Schema ist tf.truncated_normal() mit einer Standardabweichung in umgekehrtem Verhältnis zu der Anzahl der Eingabeeinheiten proporational zu verwenden:

W = tf.Variable(tf.truncated_normal([22, 5], stddev=1./22.)) 

rrao's suggestions ein Bias-Term hinzuzufügen, und wechseln Sie in dem mehr numerisch stabil tf.nn.softmax_cross_entropy_with_logits() op für Ihre Verlust-Funktion sind auch gute Ideen, und diese werden wahrscheinlich notwendige Schritte, um angemessene Genauigkeit zu erhalten.

+0

@rrao Ich habe beide Ihre Vorschläge aufgenommen, und immer noch kein Glück:/Ich habe einige Debugging und es scheint, dass nach meinem Trainingsschritt, die Gewichte sind alle NaN, was die zukünftigen Berechnungen vermasselt. Hast du eine Ahnung, was die Gewichte nach dem Trainingsschritt zu NaN machen könnte? –

+1

Vielleicht versuchen, die Lernrate zu reduzieren. – natschz

+0

Das erste, was ich ausprobiert habe:/kein Glück. Ich habe keine Ahnung was das ist. Könnten es die Daten sein? Was ich habe, sind 283 Reihen von Spielern mit 22 verschiedenen Attributen in allTrainingArray, und das entspricht 283 Spielern mit [0,0,0,0,1] (oder 1 an jedem dieser Orte), was anzeigt, um welche Art von Spieler es sich handelt . Ich schaute auf das TF-Beispiel, um meine Datenfelder zu erstellen, so dass ich nicht dachte, dass es ein Problem wäre. –

Verwandte Themen