2017-04-27 5 views
1

Ich schrieb ein neurales Netzwerk mit Keras. Es enthält BatchNormalization-Layer.Modell mit BatchNormalisierung: stagnierender Testverlust

Als ich trainierte es mit model.fit, war alles in Ordnung. Beim Training mit Tensorflow as explained here ist das Training in Ordnung, aber der Validierungsschritt liefert immer eine sehr schlechte Leistung und es sättigt schnell (die Genauigkeit beträgt 5%, 10%, 40%, 40%, 40% ..; der Verlust ist stagniert auch).

Ich brauche Tensorflow, weil es mehr Flexibilität in Bezug auf den Überwachungsteil des Trainings erlaubt.

Ich vermute stark, hat es etwas mit BN-Schichten zu tun, oder/und die Art, wie ich die Testleistungen zu berechnen (siehe unten)

feed_dict = {x: X_valid, 
      batch_size_placeholder: X_valid.shape[0], 
      K.learning_phase(): 0, 
      beta: self.warm_up_schedule(global_step) 
      } 
if self.weights is not None: 
    feed_dict[weights] = self.weights 
acc = accuracy.eval(feed_dict=feed_dict) 

Gibt es etwas Besonderes zu tun, wenn die Validierung Genauigkeit eines Modell Rechen enthält Keras BatchNormalizatin Schichten?

Vielen Dank im Voraus!

Antwort

0

Eigentlich fand ich heraus, über das training Argument der __call__ method of the BatchNormalization layer

Also, was Sie tun können, wenn die Schicht Instantiierung ist nur:

x = Input((dim1, dim2)) 
h = Dense(dim3)(x) 
h = BatchNormalization()(h, training=K.learning_phase()) 

Und bei der Bewertung der Leistung auf Validierungsset:

feed_dict = {x: X_valid, 
      batch_size_placeholder: X_valid.shape[0], 
      K.learning_phase(): 0, 
      beta: self.warm_up_schedule(global_step) 
      } 
acc = accuracy.eval(feed_dict=feed_dict) 
summary_ = merged.eval(feed_dict=feed_dict) 
test_writer.add_summary(summary_, global_step) 
+0

Nun, eigentlich habe ich mich geirrt, es funktioniert nicht, aber ich verstehe nicht warum – sbaur

+0

Ich lief gerade in ein ähnliches Problem und fand diese Einstellung ng 'training = 1' in' BatchNormalization's '__call__' scheint zu funktionieren. Das Setzen von 'K.learning_phase()' auf 0 oder 1 scheint keinen Einfluss auf die Ausgabe zu haben, was die Batch-Normalisierung betrifft, und solange Sie Ihr Training nicht ausführen, sollten die Batch-Norm-Parameter nicht ' t ändern. – zo7

+0

Sie würden also empfehlen, anstelle von K.learning_phase() einen anderen Platzhalter zu verwenden? – sbaur