2017-04-05 6 views
2

Ich versuche, den Regularisierungsbegriff für die Norm des Farbverlaufs für improved WGAN training in Keras mit Theano-Backend zu implementieren. Grundsätzlich möchte ich die L2-Norm des Gradienten zu bestrafen, je nachdem, wie weit weg ist es von 1.Keras wirft einen DisconnectedInputError aufgrund der benutzerdefinierten Verlustfunktion

Ich bin eine benutzerdefinierte Verlust wie diese Umsetzung:

def get_gradient_norm(model, y_pred): 
    weights = model.trainable_weights 
    gradients = model.optimizer.get_gradients(K.mean(y_pred), weights) 
    acc = None 
    for g in gradients: 
     s = K.sum(K.square(g)) 
     if acc == None: 
      acc = s 
     else: 
      acc = s + acc 
    return K.sqrt(acc) 

def make_w_reg_loss(model): 
    lvar = K.variable(lamb, name="Lambda") 

    def foo(y_true, y_pred): 
     gnorm = get_gradient_norm(model, y_pred) 
     return lvar * K.square(gnorm - 1) 

return foo 

[...] 

critic.compile(loss=make_w_reg_loss(critic), optimizer=RMSprop(learn_rate)) 

Es wirft ein DisconnectedInputError einmal den Trainingsprozess versucht um zu versuchen, den Verlauf meiner benutzerdefinierten Verlustfunktion zu erhalten.

Warum?

Ersetzen der Verlust mit einigen Standardverlust arbeitet. Der Fehler ist etwas über die Verlustfunktion, die ich definiert habe.

Sehen Sie diesen Kern für a minimal not-working example meinen Versuch

EDIT:

So weiß ich, denke ich, wie es jetzt arbeiten. Zuerst habe ich nur zufällig, diesen Begriff zu meinen Verlust, direkt bevor es aus foo Rückkehr (y_true, y_pred):

K.mean(y_pred) - K.mean(y_pred) 

eindeutig eine konstante Null, und wenn ich nur diesen Begriff als mein Verlust verwende ich tun, um eine Null. Wenn ich jedoch diese "Konstante Null" zu meinem Regularisierungsverlust addiere, funktioniert es plötzlich gut. Ich bekomme einen Verlust, der nicht null ist, also kommt von der Regularisierung, und Optimierung über viele train_on_batch reduziert auch den Verlust.

Also ist das ein seltsames Problem mit theano ein wenig übereifrig in Ausnahmen zu werfen? Meine Frage steht immer noch: Warum wirft es den ursprünglichen Code ein? Da das Hinzufügen eines konstanten Terms es behebt, sieht es für mich wie ein Fehler aus?

Antwort

0

Ich möchte wirklich diese verbesserte WG in Keras auch implementieren, und ich bin überrascht zu sehen, wie Sie Ihr "Problem" gelöst haben. Hast du durch Experimente verifiziert, dass dein wgan-gp-Verlust wie geplant funktioniert? Es sollte einfach zu überprüfen sein, es ist ein so stabiles Training, das Ihnen die Verwendung von sehr tiefen Diskriminator ermöglicht;) Ich möchte die gleiche Arbeit von Ihnen getan, aber mit Tensorflow Backend, und ich werde versuchen, Ihren Code zu betrachten und der Code hier: keras improved wgan

Ich werde glücklich sein, Ihre Updates zu hören, ich werde hier wieder schreiben, sobald ich einen Arbeitscode von WGG in Keras/Tensorflow habe! P.S. Der obige Link implementiert die gesamte Prozedur im Tensorflow-Code und zwingt zur Verwendung der tf-Trainingsfunktionen. Ich mag Ihren Ansatz, wo wir einfach einen Keras Verlust definieren können, mit allen unseren üblichen Keras High-Level-API für das Training;)

edit: von Ihrem Code scheint Sie völlig mit K Backend arbeiten, so sollte Ihr Code leicht mit Tensorflow Backend zu laufen. Haben Sie versucht, das Backend zu ändern, um zu überprüfen, ob das Problem wirklich mit Theano zusammenhängt?

2. Edit: Sie berechnen den Gradient w.r.t die Gewichte, aber die in der WGG-Papier der Gradient Penalty wird ausgehend von Gradient w.r.t die durchschnittliche Proben zwischen generierten und realen Proben berechnet. Dies würde sehr unterschiedliche Ergebnisse bringen. Im folgenden Link eine sehr schöne verbesserte wgan Verlust Umsetzung finden, das auch auf Theanos konnte Arbeit: https://github.com/farizrahman4u/keras-contrib/

+0

Der Code, den ich geschrieben ist eine brutale Version abgeholzt und alles richtig sicher nicht zu realisieren, war es wollte nur das Problem zeigen. Mein realer Code implementiert das Sampling, indem interpolierte Datenpunkte zwischen echten und falschen Samples übergeben werden. Ich habe die Spielzeugbeispiele bisher nur getestet, aber sie sahen vielversprechend aus. Ich wurde jedoch von "realer" Arbeit abgelenkt, sodass ich komplexere Datensätze nicht testen konnte. –

+0

Ich habe nicht mit Tensorflow getestet, habe keine Installation hier, da die endgültige Verlustfunktion viel mehr Begriffe enthält, ist das Ausnahmeproblem nicht wirklich ein Problem. Es hat mich nur verwirrt. Ich würde vermuten, dass die Wgan-Implementierung, die Sie gepostet haben, wahrscheinlich von Leuten mit mehr Erfahrung in Keras geschrieben wurde und besser dokumentiert ist. Ich könnte das einfach benutzen, wenn ich darauf zurückkomme, da es den Interpolationsteil auf der GPU zu implementieren scheint, habe ich es in der CPU gemacht. Cool! –

+0

Ich verlor 12 Stunden beim Debuggen, versuchte den Code, den ich verlinkte, zu modifizieren, um als separater Gradientstressverlust zu arbeiten (statt in den Diskriminator integriert zu werden) und ich klebte bald an der Wand "Tensorflow bekommt None als Verlust" Typ Fehler. Plötzlich erinnere ich mich an deine Lösung, und nun, in meinem Fall geht es auch. Ohne Ihr Update, wenn ich das Modell über model.summary() visualisiere, gibt es keine Eingabeschicht. Mit Ihrer einfachen Lösung erscheint plötzlich die Eingabeschicht als Eingabe (und der Gradientstraining-Verlust funktioniert, ohne None-Fehler zu geben) –

Verwandte Themen