2016-02-14 4 views
7

Ich habe ein neuronales Netzwerk mit versteckter Schicht mit einer pyramidenförmigen Architektur mit TensorFlow erstellt. Hier ist der Code:Validierung und Test mit TensorFlow

num_classes = 10 
image_size = 28 

#Read the data 
train_dataset, train_labels, valid_dataset, valid_labels, test_dataset, test_labels = OpenDataSets("...") 
#Create and convert what is needed. 
tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size * image_size)) 
tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels)) 
tf_valid_dataset = tf.constant(valid_dataset) 
tf_test_dataset = tf.constant(test_dataset) 

#Then I create the NN. 
Wh = tf.Variable(tf.truncated_normal([image_size * image_size, image_size * image_size/2])) 
bh = tf.Variable(tf.truncated_normal([image_size * image_size/2])) 
hidden = tf.nn.relu(tf.matmul(tf_train_dataset, Wh) + bh) 

Wout = tf.Variable(tf.truncated_normal([image_size * image_size/2, num_labels])) 
bout = tf.Variable(tf.truncated_normal([num_labels])) 
logits = tf.nn.relu(tf.matmul(hidden, Wout) + bout) 

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels)) 
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 
train_prediction = tf.nn.softmax(logits) 

Und jetzt ich meine NN Zug:

with tf.Session(graph=graph) as session: 
    tf.initialize_all_variables().run() 
    for step in range(1000): 
     offset = (step * batch_size) % (train_labels.shape[0] - batch_size) 
     batch_data = train_dataset[offset:(offset + batch_size), :] 
     batch_labels = train_labels[offset:(offset + batch_size), :] 
     feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels} 
     _, l, predictions = session.run([optimizer, loss, train_prediction], feed_dict=feed_dict) 

Nun würde Ich mag meine NN nach dem Training zu validieren und zu testen. Aber ich weiß nicht, wie man das neue feed_dict erstellt und session.run verwendet, um zu validieren/testen.

Danke für Ihre Hilfe!

Antwort

8

Sie müssen zuerst geeignete Validierungs-/Testtensorfunktionen erstellen. Bei einer einlagigen MPL handelt es sich um verschachtelte Multiplikation mit Gewichten und Addition von Verzerrungen (und auch Relus, da Sie sie in Ihrem ursprünglichen Modell haben). Definieren Sie diese direkt unter den Zug Prognosen

valid_prediction = tf.nn.softmax(
         tf.nn.relu(tf.matmul(
         tf.nn.relu(tf.matmul(tf_valid_dataset, Wh) + bh)), Wout) + bout))) 
test_prediction = tf.nn.softmax(
         tf.nn.relu(tf.matmul(
         tf.nn.relu(tf.matmul(tf_test_dataset, Wh) + bh)), Wout) + bout))) 

Diese Ausdrücke sind in der Tat ziemlich identisch mit logit Variable im Code definiert, nur tf_valid_dataset und tf_test_dataset jeweils verwendet wird. Sie können Zwischenvariablen erstellen, um sie zu vereinfachen.

Sie müssen dann eine Validierungs-/Testfunktion erstellen, um die Genauigkeit zu prüfen. Am einfachsten wäre es, die wahrscheinlichste vorhergesagte Klasse zu testen (Misclassification error grob). Definieren Sie dies außerhalb Ihres Diagramms/Ihrer Sitzung.

def accuracy(predictions, labels): 
     pred_class = np.argmax(predictions, 1) 
     true_class = np.argmax(labels, 1) 
     return (100.0 * np.sum(pred_class == true_class)/predictions.shape[0]) 

Danach können Sie einfach passieren diese Genauigkeit Funktion innerhalb derselben Sitzung/feed_dict Validierung/Test-Ergebnis zu berechnen.

print 'Validation accuracy: %.1f%%' % accuracy(valid_prediction.eval(), valid_labels) 
print 'Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels) 
+1

Vielen Dank für Ihre Antwort. Also, wenn ich es richtig verstehe, muss ich zwei andere NNs erstellen, die tatsächlich Zeiger auf meine ursprüngliche NN sind, weil sie genau die gleichen trainierbaren Gewichte verwenden. Habe ich recht? – FiReTiTi

+1

Ich erwartete, meine ursprüngliche NN mit verschiedenen Eingaben zu verwenden. – FiReTiTi

+1

Nein, nein, Sie verwenden genau das gleiche Netzwerk zur Validierung - definieren Sie einfach zwei Funktionen im selben Netzwerk und die gleiche Genauigkeit() in derselben Sitzung –