2016-07-28 7 views
0

Ich habe ein Tensorflow-Programm mit vier Ausgangsbeschriftungen. Ich habe das Modell trainiert und werte jetzt separate Daten damit aus.Tensorflow tf.nn.in_top_k Fehlerziele [0] liegt außerhalb des Bereichs

Das Problem ist, dass, nachdem ich den Code verwenden

import tensorflow as tf 

import main 
import Process 
import Input 

eval_dir = "/Users/Zanhuang/Desktop/NNP/model.ckpt-30" 
checkpoint_dir = "/Users/Zanhuang/Desktop/NNP/checkpoint" 


def evaluate(): 
    with tf.Graph().as_default() as g: 
    images, labels = Process.eval_inputs() 
    forward_propgation_results = Process.forward_propagation(images) 
    init_op = tf.initialize_all_variables() 
    saver = tf.train.Saver() 
    top_k_op = tf.nn.in_top_k(forward_propgation_results, labels, 1) 

    with tf.Session(graph=g) as sess: 
    sess.run(init_op) 
    saver.restore(sess, eval_dir) 
    tf.train.start_queue_runners(sess=sess) 
    print(sess.run(top_k_op)) 

def main(argv=None): 
    evaluate() 

if __name__ == '__main__': 
    tf.app.run() 

Insgesamt habe ich eine Klasse nur haben.

Mein Code für die Fehlerrate, wo ich die Etiketten in einer One-hot-Matrix einzuführen, ist hier:

def error(forward_propagation_results, labels): 
    labels = tf.one_hot(labels, 4) 
    tf.transpose(labels) 
    labels = tf.cast(labels, tf.float32) 
    mean_squared_error = tf.square(tf.sub(labels, forward_propagation_results)) 
    cost = tf.reduce_mean(mean_squared_error) 
    train = tf.train.GradientDescentOptimizer(learning_rate = 0.05).minimize(cost) 
    tf.histogram_summary('accuracy', mean_squared_error) 
    tf.add_to_collection('losses', cost) 

    tf.scalar_summary('LOSS', cost) 

    return train, cost 
+0

Dieser Fehler weist auf eine Diskrepanz zwischen der Form von 'forward_propagation_results' (angenommen als Matrix der Größe' bxc') und den Werten in 'labels' hin (angenommen ein Vektor der Länge' b' mit allen Werten <' c'). Können Sie versuchen, die Anweisung 'print (forward_propagation_result, sess.run (labels))' vor der fehlgeschlagenen Zeile hinzuzufügen? – mrry

+0

Sicher: Das ist mein Ergebnis: (, Array ([40], dtype = int32)) –

Antwort

0

Das Problem ungültige Daten in Ihrem labels Tensor ist. Von your comment ist der labels Tensor ein Vektor, der einen einzelnen Wert enthält: [40]. Der Wert 40 ist größer als die Anzahl der Spalten in forward_propagation_result (also 4).

Die tf.nn.in_top_k(predictions, targets, k) op hat folgendes Verhalten:

  • Für jede Zeile predictions[i, :]:
    • result[i] wahr ist, wenn eine der predictions[i, targets[i]] k größten Elemente in dieser Zeile ist; sonst ist es falsch.

Es gibt keinen Wert predictions[0, 40], weil (wie Ihr Kommentar zeigt) dieses Argument eine 1 x 4 Matrix ist. Daher gibt TensorFlow Ihnen einen out of range Fehler. Dies deutet darauf hin, dass entweder Ihre Bewertungsdaten falsch sind oder Sie eine andere Bewertungsfunktion verwenden sollten.

+0

Was meinst du mit falsch ? Es ist im genauen Format wie CIFAR 10. Und auch, was meinst du mit einer anderen Bewertungsfunktion. Ich kenne nur die k_top –

+0

Das Bewertungsbeispiel, das Sie in das Netzwerk einspeisen, geht davon aus, dass die Bezeichnung der Klasse 40 ist. Ihr Netzwerk produziert 4 Ausgänge für jedes Beispiel, die "tf.nn.in_top_k()" als Ergebnisse interpretiert für die Labels 0, 1, 2 und 3. Entweder sind die Evaluierungsdaten falsch (könnte z. B. beschädigt sein, wenn Sie nur 4 verschiedene Labels erwarten), oder das Netzwerk selbst ist falsch (es sollte mindestens 41 Outputs erzeugen) Beispiel, so dass das Label 40 gültig ist). – mrry

+0

Ich kann nicht sehen, wo mein Code im Netzwerk falsch ging, aber möglicherweise die Daten. Das Netzwerk hatte ohne Probleme trainiert und den richtigen Weg genommen. Sie haben etwas über die Verwendung einer anderen Bewertungsfunktion gesagt. Wie würdest du das machen? –

Verwandte Themen