2017-11-07 4 views
0

Für Forschungszwecke Ich bin ein neuronales Netz trainiert, die ihre Gewichte unterschiedlich in Abhängigkeit von der Parität der Epoche aktualisiert:Keras mit tensorflow wirft ResourceExhaustedError

1) Ist die Epoche selbst, ändern Sie die Gewichte der NN mit Backpropagation

2) Wenn die Epoche ungerade ist, aktualisiere das Modell nur mit update_weights_with_custom_function() und friere das Netzwerk ein.

Hier ein vereinfachtes Teil des Codes ist, dass dieser implementiert (man beachte das epochs=1):

for epoch in range(nb_epoch): 

    if epoch % 2 == 0: 
     model.trainable = True # Unfreeze the model 
    else: 
     model.trainable = False # Freeze the model 
    model.compile(optimizer=optim, loss=gaussian_loss, metrics=['accuracy']) 

    hist = model.fit(X_train, Y_train, 
      batch_size=batch_size, 
      epochs=1, 
      shuffle=True, 
      verbose=1, 
      callbacks=[tbCallBack, csv_epochs, early_stop], 
      validation_data=(X_val, Y_val)) 

    if epoch % 2 == 1: 
     update_weights_with_custom_function() 

Problem: nach einiger Epoche, wirft Keras ein ResourceExhaustedError aber nur mit tensorflow, nicht mit Theano. Es scheint, dass das Erstellen von Modellen, ohne sie zu veröffentlichen, über compile() erfolgt.

Deshalb, was soll ich tun? Ich weiß, dass K.clear_session() Speicher freigibt, aber es erfordert, das Modell zu speichern und neu zu laden (see), die mir einige Probleme gibt, wie load_model() in meinem Fall funktioniert nicht aus der Box.

Ich bin auch offen für andere Möglichkeiten zu tun, was ich versuche zu erreichen (d. H. Einfrieren eines NN-Modells abhängig von der Parität der Epoche).

Zusammenfassung: keras mit tensorflow Backend ist eine ResourceExhaustedError werfen, weil ich über compile() bin Looping.

+0

Eine ähnliche Situation wurde hier https://github.com/fchollet/keras/issues/2973 gemeldet. Allerdings hilft es mir nicht, wie man praktisch auf das Problem eingeht. –

+0

Warum rufen Sie fit an, wenn Sie Ihr Modell als "nicht trainierbar" festlegen? Sollte das in diesem Fall nicht ausreichend sein? –

Antwort

0

Wie Marcin Możejko darauf hinwies, macht die Verwendung von eval() genau das, was ich erreichen wollte.

Ich habe einen benutzerdefinierten Rückruf (Inspiration war here), die die Schleife über compile()

Das Problem ist gelöst wird nun verhindert, selbst wenn die tensorflow Problem nicht direkt angesprochen wurde.

Verwandte Themen