Ich habe in vielen verfügbaren neuronalen Netzwerkcodes, die mit TensorFlow implementiert wurden, festgestellt, dass Regularisierungsterme häufig durch manuelles Hinzufügen eines zusätzlichen Terms zum Verlustwert implementiert werden.
Meine Fragen sind:
Gibt es eine elegantere oder empfohlene Art der Regularisierung als die manuelle?
Ich finde auch, dass
get_variable
das ein Argument hatregularizer
. Wie soll es verwendet werden? Nach meiner Beobachtung wird, wenn wir einen Regularisierer an ihn übergeben (z. B.tf.contrib.layers.l2_regularizer
ein Tensor, der einen regulierten Term darstellt, berechnet und zu einer Diagrammsammlung mit dem Namen hinzugefügttf.GraphKeys.REGULARIZATOIN_LOSSES
. Wird diese Sammlung automatisch von TensorFlow verwendet (z. B. von Optimierern beim Training verwendet)? Wird erwartet, dass ich diese Sammlung selbst verwenden sollte?
quelle
S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
?Antworten:
Wie Sie im zweiten Punkt sagen, wird die Verwendung des
regularizer
Arguments empfohlen. Sie können es in verwendenget_variable
oder einmal in Ihrem festlegenvariable_scope
und alle Ihre Variablen regulieren lassen.Die Verluste werden in der Grafik erfasst, und Sie müssen sie wie folgt manuell zu Ihrer Kostenfunktion hinzufügen.
Hoffentlich hilft das!
quelle
reg_constant
möglicherweise nicht notwendig, da Regularisierer in TensorFlow ein Argumentscale
in ihren Konstruktoren haben, damit die Auswirkung von reg-Begriffen feinkörniger gesteuert werden kann. Und (2) die Verwendung vontf.add_n
könnte etwas besser sein alssum
, ich denke, die Verwendung von sum könnte viele Tensoren im Diagramm erzeugen, um Zwischenergebnisse zu speichern.S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
, habe ich dann den Code, den Sie vorgeschlagen haben? Wie insum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
?tf.reduce_sum
sollte statt verwendet werdensum
?Einige Aspekte der vorhandenen Antwort waren mir nicht sofort klar, daher hier eine Schritt-für-Schritt-Anleitung:
Definieren Sie einen Regularizer. Hier kann die Regularisierungskonstante eingestellt werden, z.
Erstellen Sie Variablen über:
Entsprechend können Variablen über den regulären
weights = tf.Variable(...)
Konstruktor erstellt werden, gefolgt vontf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights)
.Definieren Sie einen
loss
Begriff und fügen Sie den Regularisierungsbegriff hinzu:Hinweis: Es sieht so aus
tf.contrib.layers.apply_regularization
, als wäre es als implementiertAddN
, also mehr oder weniger äquivalent zusum(reg_variables)
.quelle
apply_regularization
sollte nicht erforderlich sein, wenn Sie den Regularizer bereits beim Erstellen der Variablen angegeben haben.REGULARIZATION_LOSSES
es sich um den von den Regularisierern zurückgegebenen Gesamtverlust handelt, sodass Sie im Wesentlichen anrufenregularizer(regularizer(weight))
.Ich werde eine einfache richtige Antwort geben, da ich keine gefunden habe. Sie benötigen zwei einfache Schritte, der Rest wird durch Tensorflow-Magie erledigt:
Fügen Sie beim Erstellen von Variablen oder Ebenen Regularisierer hinzu:
Fügen Sie den Regularisierungsbegriff hinzu, wenn Sie den Verlust definieren:
quelle
Eine weitere Option, um dies mit der
contrib.learn
Bibliothek zu tun, ist die folgende, basierend auf dem Deep MNIST-Tutorial auf der Tensorflow-Website. Angenommen, Sie haben die relevanten Bibliotheken (z. B.import tensorflow.contrib.layers as layers
) importiert , können Sie zunächst ein Netzwerk in einer separaten Methode definieren:In einer Hauptmethode können Sie dann das folgende Codefragment verwenden:
Damit dies funktioniert, müssen Sie dem zuvor verlinkten MNIST-Tutorial folgen und die relevanten Bibliotheken importieren. Es ist jedoch eine gute Übung, TensorFlow zu lernen, und es ist leicht zu erkennen, wie sich die Regularisierung auf die Ausgabe auswirkt. Wenn Sie eine Regularisierung als Argument anwenden, sehen Sie Folgendes:
Beachten Sie, dass der Regularisierungsteil drei Elemente enthält, basierend auf den verfügbaren Elementen.
Mit Regularisierungen von 0, 0,0001, 0,01 und 1,0 erhalte ich Testgenauigkeitswerte von 0,9468, 0,9476, 0,9183 bzw. 0,1135, was die Gefahren hoher Regularisierungsterme zeigt.
quelle
Wenn noch jemand sucht, möchte ich nur hinzufügen, dass Sie in tf.keras eine Gewichtsregulierung hinzufügen können, indem Sie sie als Argumente in Ihren Ebenen übergeben. Ein Beispiel für das Hinzufügen einer L2-Regularisierung, die im Großhandel von der Tensorflow Keras Tutorials-Website übernommen wurde:
Soweit ich weiß, müssen die Regularisierungsverluste bei dieser Methode nicht manuell addiert werden.
Referenz: https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#add_weight_regularization
quelle
Ich habe getestet
tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
undtf.losses.get_regularization_loss()
mit eineml2_regularizer
in der Grafik festgestellt, dass sie den gleichen Wert zurückgeben. Wenn Sie die Menge des Werts beobachten, hat reg_constant den Wert bereits durch Setzen des Parameters von sinnvolltf.contrib.layers.l2_regularizer
.quelle
Wenn Sie CNN haben, können Sie Folgendes tun:
In Ihrer Modellfunktion:
In Ihrer Verlustfunktion:
quelle
Einige Antworten machen mich verwirrter. Hier gebe ich zwei Methoden, um es klar zu machen.
Dann kann es zum Gesamtverlust addiert werden
quelle
quelle
tf.GraphKeys.REGULARIZATION_LOSSES
wird nicht automatisch hinzugefügt, aber es gibt eine einfache Möglichkeit, sie hinzuzufügen:tf.losses.get_regularization_loss()
wird verwendet,tf.add_n
um die Einträge vontf.GraphKeys.REGULARIZATION_LOSSES
elementweise zu summieren .tf.GraphKeys.REGULARIZATION_LOSSES
In der Regel handelt es sich um eine Liste von Skalaren, die mithilfe von Regularisierungsfunktionen berechnet werden. Es werden Einträge von Aufrufen abgerufentf.get_variable
, für die derregularizer
Parameter angegeben wurde. Sie können diese Sammlung auch manuell hinzufügen. Dies ist nützlich, wenn Sietf.Variable
Aktivitäts-Regularisierer oder andere benutzerdefinierte Regularisierer verwenden und auch angeben. Zum Beispiel:(In diesem Beispiel wäre es vermutlich effektiver, x zu regulieren, da y für großes x wirklich abflacht.)
quelle