[python] Comment ajouter des régularisations dans TensorFlow?


Answers

Quelques aspects de la réponse existante n'étaient pas immédiatement clairs pour moi, alors voici un guide pas-à-pas:

  1. Définir un régularisateur. C'est ici que la constante de régularisation peut être définie, par exemple:

    regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
    
  2. Créer des variables via:

        weights = tf.get_variable(
            name="weights",
            regularizer=regularizer,
            ...
        )
    

    De manière équivalente, les variables peuvent être créées via le constructeur normal weights = tf.Variable(...) , suivi de tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights) .

  3. Définir un terme de loss et ajouter le terme de régularisation:

    reg_variables = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
    reg_term = tf.contrib.layers.apply_regularization(regularizer, reg_variables)
    loss += reg_term
    

    Note: Il semble que tf.contrib.layers.apply_regularization soit implémenté comme AddN , donc plus ou moins équivalent à sum(reg_variables) .

Question

J'ai trouvé dans beaucoup de code de réseau neuronal disponible implémenté en utilisant TensorFlow que les termes de régularisation sont souvent implémentés en ajoutant manuellement un terme supplémentaire à la valeur de perte.

Mes questions sont:

  1. Existe-t-il un moyen de régularisation plus élégant ou recommandé que de le faire manuellement?

  2. Je trouve aussi que get_variable a un argument regularizer . Comment devrait-il être utilisé? Selon mon observation, si nous lui passons un regularizer (comme tf.contrib.layers.l2_regularizer , un tenseur représentant un terme régularisé sera calculé et ajouté à une collection de graphes nommée tf.GraphKeys.REGULARIZATOIN_LOSSES . par TensorFlow (par exemple utilisé par les optimiseurs lors de la formation) Ou est-il prévu que je devrais utiliser cette collection par moi-même?




cross_entropy = tf.losses.softmax_cross_entropy(
  logits=logits, onehot_labels=labels)

l2_loss = weight_decay * tf.add_n(
     [tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables()])

loss = cross_entropy + l2_loss



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:

  1. Ajoutez des régularisateurs lors de la création de variables ou de calques:

    tf.layers.dense(x, kernel_regularizer=tf.contrib.layers.l2_regularizer(0.001))
    # or
    tf.get_variable('a', regularizer=tf.contrib.layers.l2_regularizer(0.001))
    
  2. Ajoutez le terme de régularisation lors de la définition de la perte:

    loss = ordinary_loss + tf.losses.get_regularization_loss()
    





Related