J'ai trouvé dans de nombreux codes de réseau neuronal disponibles mis en œuvre à l'aide de TensorFlow que les termes de régularisation sont souvent mis en œuvre en ajoutant manuellement un terme supplémentaire à la valeur de perte.
Mes questions sont:
Existe-t-il un moyen de régularisation plus élégant ou recommandé que de le faire manuellement?
Je trouve également que cela
get_variable
a un argumentregularizer
. Comment doit-il être utilisé? Selon mon observation, si nous lui passons un régulariseur (par exempletf.contrib.layers.l2_regularizer
, un tenseur représentant un terme régularisé sera calculé et ajouté à une collection de graphes nomméetf.GraphKeys.REGULARIZATOIN_LOSSES
. Cette collection sera-t-elle automatiquement utilisée par TensorFlow (par exemple utilisée par les optimiseurs lors de l'entraînement)? Ou Dois-je utiliser cette collection par moi-même?
la source
S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
?Réponses:
Comme vous le dites dans le deuxième point, l'utilisation de l'
regularizer
argument est la méthode recommandée. Vous pouvez l'utiliserget_variable
ou le définir une fois dans votrevariable_scope
et faire régulariser toutes vos variables.Les pertes sont collectées dans le graphique et vous devez les ajouter manuellement à votre fonction de coût comme ceci.
J'espère que cela pourra aider!
la source
reg_constant
ce n'est peut-être pas nécessaire, car les régularisateurs de TensorFlow ont un argumentscale
dans leurs constructeurs afin que l'impact des termes reg puisse être contrôlé d'une manière plus fine. Et (2) l'utilisationtf.add_n
pourrait être légèrement meilleure quesum
, je suppose que l'utilisation de la somme pourrait créer de nombreux tenseurs dans le graphique pour stocker le résultat intermédiaire.S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
, puis-je le code que vous avez suggéré? Comme danssum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
?tf.reduce_sum
devrait être utilisé à la place desum
?Quelques aspects de la réponse existante n'étaient pas immédiatement clairs pour moi, voici donc un guide étape par étape:
Définissez un régularisateur. C'est ici que la constante de régularisation peut être définie, par exemple:
Créez des variables via:
De manière équivalente, les variables peuvent être créées via le
weights = tf.Variable(...)
constructeur régulier , suivi detf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights)
.Définissez un
loss
terme et ajoutez le terme de régularisation:Remarque: il semble qu'il
tf.contrib.layers.apply_regularization
soit implémenté comme unAddN
, donc plus ou moins équivalent àsum(reg_variables)
.la source
apply_regularization
ne devrait pas être nécessaire si vous avez déjà spécifié le régulariseur lors de la création de la variable.REGULARIZATION_LOSSES
c'est la perte totale retournée par les régularisateurs, donc vous appelez essentiellementregularizer(regularizer(weight))
.Je vais fournir une réponse simple et correcte puisque je n'en ai pas trouvé. Vous avez besoin de deux étapes simples, le reste est fait par la magie tensorflow:
Ajoutez des régularisateurs lors de la création de variables ou de couches:
Ajoutez le terme de régularisation lors de la définition de la perte:
la source
Une autre option pour le faire avec la
contrib.learn
bibliothèque est la suivante, basée sur le didacticiel Deep MNIST sur le site Web Tensorflow. Tout d'abord, en supposant que vous avez importé les bibliothèques pertinentes (telles queimport tensorflow.contrib.layers as layers
), vous pouvez définir un réseau dans une méthode distincte:Ensuite, dans une méthode principale, vous pouvez utiliser l'extrait de code suivant:
Pour que cela fonctionne, vous devez suivre le didacticiel MNIST auquel j'ai lié précédemment et importer les bibliothèques pertinentes, mais c'est un bon exercice pour apprendre TensorFlow et il est facile de voir comment la régularisation affecte la sortie. Si vous appliquez une régularisation en tant qu'argument, vous pouvez voir ce qui suit:
Notez que la partie régularisation vous donne trois éléments, en fonction des éléments disponibles.
Avec des régularisations de 0, 0,0001, 0,01 et 1,0, j'obtiens des valeurs de précision de test de 0,9468, 0,9476, 0,9183 et 0,1135, respectivement, montrant les dangers des termes de régularisation élevés.
la source
Si quelqu'un cherche toujours, je voudrais juste ajouter que dans tf.keras, vous pouvez ajouter une régularisation de poids en les passant comme arguments dans vos couches. Un exemple d'ajout de régularisation L2 pris en gros à partir du site Tensorflow Keras Tutorials:
Il n'est pas nécessaire d'ajouter manuellement les pertes de régularisation avec cette méthode pour autant que je sache.
Référence: https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#add_weight_regularization
la source
J'ai testé
tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
ettf.losses.get_regularization_loss()
avec unl2_regularizer
dans le graphique, et j'ai trouvé qu'ils renvoient la même valeur. En observant la quantité de la valeur, je suppose que reg_constant a déjà un sens sur la valeur en définissant le paramètre detf.contrib.layers.l2_regularizer
.la source
Si vous avez CNN, vous pouvez faire ce qui suit:
Dans votre fonction modèle:
Dans votre fonction de perte:
la source
Certaines réponses me rendent plus confus. Ici, je donne deux méthodes pour le faire clairement.
Ensuite, il peut être ajouté à la perte totale
la source
la source
tf.GraphKeys.REGULARIZATION_LOSSES
ne seront pas ajoutés automatiquement, mais il existe un moyen simple de les ajouter:tf.losses.get_regularization_loss()
utilisetf.add_n
pour additionner les entrées de l'tf.GraphKeys.REGULARIZATION_LOSSES
élément par élément.tf.GraphKeys.REGULARIZATION_LOSSES
sera généralement une liste de scalaires, calculés à l'aide des fonctions de régularisation. Il obtient les entrées des appels àtf.get_variable
qui ont leregularizer
paramètre spécifié. Vous pouvez également ajouter manuellement à cette collection. Cela serait utile lors de l'utilisationtf.Variable
et également lors de la spécification des régulariseurs d'activité ou d'autres régulariseurs personnalisés. Par exemple:(Dans cet exemple, il serait probablement plus efficace de régulariser x, car y s'aplatit vraiment pour un x grand.)
la source