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!
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
Ich werde versuchen, die Abklingrate zu ändern und die Stabilität zu verbessern, wie Sie es empfohlen haben. – Charles