python plot title - Comment ajouter des régularisations dans TensorFlow?





3 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) .

matplotlib position subplot

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?




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()
    



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



Related