2017-01-24 2 views
0

Ich experimentiere mit TensorFlow, um den Dreh raus zu bekommen. Versuchen Sie, eine Version des grundlegenden MNIST-Beispiels zu erstellen, indem Sie Zeilen aus einer CSV-Datei anstelle von Bildern lesen. Ich füge den Code basierend auf dem MNIST-Beispiel und dem CSV-Feeder-Beispiel zusammen.TensorFlow: Druckausgabewert von jeder Iteration

Die ersten 100 Zellen in jeder Zeile meiner CSV stellen ein "Bild" einer Zahl dar, und die nächsten 10 Zellen in derselben Zeile repräsentieren ein "Label", das das Bild ähnlich wie das Etikett im MNIST-Beispiel identifiziert.

Ich versuche zu drucken, was TensorFlow tatsächlich die Zahl während jeder Iteration über die CSV-Zeilen schätzt, indem das tatsächliche Etikett und die "erraten" Ausgabe für jede Iteration Seite-an-Seite gedruckt werden. Aber es sieht so aus, als würde ich tatsächlich beide Male das echte Etikett drucken, da die y Variable erfordert, dass ich die aktuellen x Werte füttere, um den x Platzhalter zu ersetzen.

Wie kann ich für jede Iteration die Schätzung und nicht das tatsächliche Etikett ausdrucken?

Mein Code sieht wie folgt aus:

fileName = 'TEST_data/TFTest.csv' 

filename_queue = tf.train.string_input_producer([fileName]) 

reader = tf.TextLineReader() 
key, value = reader.read(filename_queue) 

rDefaults = [] 
for i in range(0,110): 
    rDefaults.append((list([0]))) 

data = tf.decode_csv(value, record_defaults=rDefaults) 
fPack = tf.slice(data, [0], [100]) 
lPack = tf.slice(data, [100], [10]) 

features = tf.pack(fPack) 
label = tf.pack(lPack) 

x = tf.placeholder(tf.float32, [None, 100]) 
W = tf.Variable(tf.zeros([100, 10])) 
b = tf.Variable(tf.zeros([10])) 
y = tf.matmul(x, W) + b 

y_ = tf.placeholder(tf.float32, [None, 10]) 

cross_entropy = tf.reduce_mean(
     tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)) 
train_step = tf.train.GradientDescentOptimizer(.5).minimize(cross_entropy) 

with tf.Session() as sess: 
    init = tf.initialize_all_variables() 
    sess.run(init) 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 
    i = 0 
    for i in range(10): 
     f, l = sess.run([features, label]) 
     f1 = np.reshape(f, (-1, 100)) 
     l1 = np.reshape(l, (-1, 10)) 
     sess.run(train_step, feed_dict={x: f1, y_: l1}) 
     if i%1==0: 
      print(sess.run(tf.argmax(l1, 1))) 
      print(sess.run(tf.argmax(y, 1), feed_dict={x: f1})) 
      print('********') 
     i = i + 1 

    coord.request_stop() 
    coord.join(threads) 

Antwort

0

diese Zeile gibt Ihnen den Index des höchsten Wert innerhalb der softmax y

print(sess.run(tf.argmax(y, 1), feed_dict={x: f1})) 

wenn Sie einen solchen Wert drucken möchten, dann müssen Sie holen der Wert bei diesem Index.

print(sess.run(y[tf.argmax(y, 1)], feed_dict={x: f1})) 

Wenn ich Ihre Frage richtig verstanden habe.

+0

Danke, ich verstehe das oben, aber es ist nicht ganz das, was ich gefragt habe: warum meine Vorhersagen immer genau die gleichen wie die tatsächlichen Etiketten herauskommen. Der Ausgabevektor sieht zufällig-isch aus, aber der höchste Wert stimmt immer mit dem echten Label überein, TF kann nicht so gut sein! Selbst mit zufälligen Nullen und Einsen in den ersten 100 Zellen von Xs zeigt sess.run (y) immer den Schätzwert, der den Bezeichnungen 100% entspricht. Ich frage mich, ob Y von einem Platzhalter für x'es abhängt, den ich über feed_dict liefern muss, um den Wert von Ys zu erhalten, oder höchstwahrscheinlich, weil ich etwas völlig falsches an der gesamten Logik des Programms mache? –

+0

Wie druckt es für Sie den obigen Code? nicht diese Eingabe CSV-Datei kann ich nicht reproduzieren. Aber es kann bis zu 100% Genauigkeit erreichen, wenn der Datensatz klein ist und das Netzwerk genug Kapazität hat, um den gesamten Datensatz zu speichern (Überanpassung) ... – fabrizioM

+0

Hmm. vielleicht hast du recht und es ist nur überanpassend, denn das ist tatsächlich ein sehr kleiner Datensatz nur zum Testen. Die Ausgabe sieht folgendermaßen aus: Wenn das tatsächliche Label wie folgt ist [0,0,1,0], lautet die geschätzte Ausgabe [0,0,0,0], bevor Sie sess.run ausführen (train_step, feed_dict = { x: f1, y_: l1}) und etwas wie [.91, .91, 15.1, .85], nachdem du den train_step ausgeführt hast. Es scheint also, dass der train_step das Richtige tut, da vorher alles auf Nullen initialisiert wurde und es sich um eine nicht normalisierte Ausgabe mit richtiger Schätzung handelt. Ich bin nur besorgt, warum es immer 100% genau ist, sogar mit zufälligen Daten. –

Verwandte Themen