2017-02-21 3 views
0

Ich habe einen seltsamen Fehler in TensorFlow. Betrachten Sie den folgenden Code, Teil eines einfachen Feedforward neuronales Netz:In welcher Reihenfolge wertet TensorFlow Knoten in einem Berechnungsgraphen aus?

output = (tf.matmul(layer_3,w_out) + b_out) 
prob = tf.nn.sigmoid(output); 
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = output, targets = y_, name=None)) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(loss, var_list = model_variables)` 

(Beachten Sie, dass prob nicht die Verlustfunktion zu definieren, verwendet wird, Dies liegt daran, sigmoid_cross_entropy sigmoid in seiner Definition gilt intern.) ich später laufen der Optimierer in der folgenden Zeile:

result,step_loss,_ = sess.run(fetches = [output,loss,optimizer],feed_dict = {x_ : np.array([[x,y,x*x,y*y,x*y]]), y_ : [[1,0]]}); 

Das obige funktioniert gut. Wenn ich stattdessen die folgende Zeile ausführen, um den Code auszuführen, scheint das Netzwerk schrecklich zu funktionieren, obwohl es keinen Unterschied geben sollte!

result,step_loss,_ = sess.run(fetches = [prob,loss,optimizer],feed_dict = {x_ : np.array([[x,y,x*x,y*y,x*y]]), y_ : [[1,0]]}); 

Ich habe das Gefühl, es hat etwas mit dem zu tun hat, in dem TF die Knoten des Graphen während einer Sitzung berechnet, aber ich bin nicht sicher. Was könnte das Problem sein?

Antwort

0

Es ist kein Problem mit der Grafik, es ist nur, dass Sie verschiedene Dinge betrachten.

Im ersten Beispiel Sie bieten:

result,step_loss,_ = sess.run(fetches = [output,loss,optimizer],feed_dict = {x_ : np.array([[x,y,x*x,y*y,x*y]]), y_ : [[1,0]]})

Sie das Ergebnis speichern die output op in der result Python Variable ausgeführt wird.

Im zweiten:

result,step_loss,_ = sess.run(fetches = [prob,loss,optimizer],feed_dict = {x_ : np.array([[x,y,x*x,y*y,x*y]]), y_ : [[1,0]]})

Sie in dem result Python Variable das Ergebnis der prob op sparen.

Da beide Ops unterschiedlich sind, ist zu erwarten, dass die von ihnen zurückgegebenen Werte unterschiedlich sind.

könnten Sie

laufen

logits, activation, step_loss, _ = sess.run(fetches = [output, prob, loss, optimizer], ...)

Ihr Ergebnis zu überprüfen.

+0

Das Problem ist, dass wenn ich gegen das Testset laufe, verwende ich überhaupt kein Problem. In der Tat verwende ich folgendes zum Testen: 'result = sess.run (holt = ausgabe, feed_dict = {x_: [[X_, Y_, X_ * X_, Y_ * Y_, X_ * Y _]]}); Benutze kein Prob irgendwo, wenn ich teste. Das Ersetzen der Ausgabe durch prob beim Abrufen während des Trainings verursacht jedoch, dass die Teststufe schlecht arbeitet. – user308485

Verwandte Themen