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?
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. –
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! –
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) –