1

habe ich vor kurzem nahm Tensorflow und und habe mein Bestes versucht, an die Umgebung anzupassen. Es war nichts als wunderbar! Batch-Normalisierung mit tf.contrib.layers.batch_norm war jedoch ein wenig schwierig. Gerade jetzt, hier ist die Funktion Ich verwende:Tensorflow Batch Normalisierungs: tf.contrib.layers.batch_norm

def batch_norm(x, phase): 
    return tf.contrib.layers.batch_norm(x,center = True, scale = True, 
        is_training = phase, updates_collections = None) 

diese verwenden, folgte ich die meisten Dokumentation (auch Q & A), die ich online gefunden habe und es führte mich zu folgenden Schlussfolgerungen:

1) is_training sollte für Training auf True und für Test auf False gesetzt werden. Das macht Sinn! Beim Training hatte ich Konvergenz (Fehler < 1%, Cifar 10 Dataset).

jedoch während des Tests sind schrecklich meine Ergebnisse (Fehler> 90%), ES SEI DENN I (Update Sammlungen = None) als Argument für die Batch-Norm Funktion oben hinzufügen. Nur damit als Argument wird das Testen mir den Fehler geben, den ich erwartete.

Ich bin auch sicher, dass die folgenden für das Training verwenden:

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) 
with tf.control_dependencies(update_ops):          # Ensures, Updating ops will perform before training 
    with tf.name_scope('Cross_Entropy'): 
     cross_entropy = tf.reduce_mean(          # Implement Cross_Entropy to compute the softmax activation 
      tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)) # Cross Entropy: True Output Labels (y_), Softmax output (y_conv) 
     tf.summary.scalar('cross_entropy', cross_entropy)      # Graphical output Cross Entropy 

    with tf.name_scope('train'): 
     train_step = tf.train.AdamOptimizer(1e-2).minimize(cross_entropy)  # Train Network, Tensorflow minimizes cross_entropy via ADAM Optimization 

    with tf.name_scope('Train_Results'): 
     with tf.name_scope('Correct_Prediction'): 
      correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) # Check if prediction is wrong with tf.equal(CNN_result,True_result) 
     with tf.name_scope('Accuracy'): 
      accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  # Find the percent accuracy, take mean of correct_prediction outputs 
      tf.summary.scalar('accuracy', accuracy)        # Graphical output Classification Accuracy 

Diese sicherstellen sollten, dass die Batch-Normalisierung Parameter während des Trainings aktualisieren.

Das führt mich zu der Annahme, dass update collections = None nur ein schöner Standard für meine Chargennormalisierungsfunktion ist, die während der Testfunktion sicher keine Batch-Normalisierungsparameter anpassen wird .... Bin ich richtig?

Schließlich: Ist es normal, gute Ergebnisse zu haben (Erwarteter Fehler), wenn während der Testphase eingeschaltet Batch-Normalisierung mit und aus? Mit der obigen Batch-Norm-Funktion konnte ich gut trainieren (is_training = True) und gut testen (is_training = False). Beim Testen (is_training = True) konnte ich jedoch immer noch gute Ergebnisse erzielen. Das ist nur ein schlechtes Gefühl. Könnte jemand erklären, warum das passiert? Oder sollte es überhaupt passieren?

Vielen Dank für Ihre Zeit!

Antwort

0

Unstable decay Rate (Standard 0,999) für gleitenden Durchschnitt könnte der Grund für die recht gute Trainingsleistung, aber schlechte Validierung/Test-Leistung sein. Versuchen Sie eine etwas niedrigere decay Rate (0,99 oder 0,9). Versuchen Sie auch zero_debias_moving_mean=True für verbesserte Stabilität.

Sie können auch verschiedene Losgrößen versuchen und sehen, ob erhöht Validierung Leistung. Eine große Batchgröße kann die Validierungsleistung unterbrechen, wenn die Batch-Normalisierung verwendet wird. Siehe this.

+0

Vielen Dank für die Information! Ich verwende jedoch eine kleine Batch-Größe (100) und habe es auf ein paar andere Bereiche variiert. Ich habe keine Charge verwendet, die aufgrund von Speicherbeschränkungen für GPUs besonders groß war. – Charles

+0

Ich werde versuchen, die Abklingrate zu ändern und die Stabilität zu verbessern, wie Sie es empfohlen haben. – Charles

0

Ist Ihre Phase Variable, eine tensorflow boolean oder eine Python boolean?

+0

Meine Phase ist Tensorflow Boolean. – Charles

Verwandte Themen