How to add regularizations in TensorFlow?

后端 未结 10 1331
慢半拍i
慢半拍i 2020-12-07 06:55

I found in many available neural network code implemented using TensorFlow that regularization terms are often implemented by manually adding an additional term to loss valu

相关标签:
10条回答
  • 2020-12-07 07:39

    tf.GraphKeys.REGULARIZATION_LOSSES will not be added automatically, but there is a simple way to add them:

    reg_loss = tf.losses.get_regularization_loss()
    total_loss = loss + reg_loss
    

    tf.losses.get_regularization_loss() uses tf.add_n to sum the entries of tf.GraphKeys.REGULARIZATION_LOSSES element-wise. tf.GraphKeys.REGULARIZATION_LOSSES will typically be a list of scalars, calculated using regularizer functions. It gets entries from calls to tf.get_variable that have the regularizer parameter specified. You can also add to that collection manually. That would be useful when using tf.Variable and also when specifying activity regularizers or other custom regularizers. For instance:

    #This will add an activity regularizer on y to the regloss collection
    regularizer = tf.contrib.layers.l2_regularizer(0.1)
    y = tf.nn.sigmoid(x)
    act_reg = regularizer(y)
    tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, act_reg)
    

    (In this example it would presumably be more effective to regularize x, as y really flattens out for large x.)

    0 讨论(0)
  • 2020-12-07 07:43

    I'll provide a simple correct answer since I didn't find one. You need two simple steps, the rest is done by tensorflow magic:

    1. Add regularizers when creating variables or layers:

      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. Add the regularization term when defining loss:

      loss = ordinary_loss + tf.losses.get_regularization_loss()
      
    0 讨论(0)
  • 2020-12-07 07:47

    A few aspects of the existing answer were not immediately clear to me, so here is a step-by-step guide:

    1. Define a regularizer. This is where the regularization constant can be set, e.g.:

      regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
      
    2. Create variables via:

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

      Equivalently, variables can be created via the regular weights = tf.Variable(...) constructor, followed by tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights).

    3. Define some loss term and add the regularization term:

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

      Note: It looks like tf.contrib.layers.apply_regularization is implemented as an AddN, so more or less equivalent to sum(reg_variables).

    0 讨论(0)
  • 2020-12-07 07:47

    If you have CNN you may do the following:

    In your model function:

    conv = tf.layers.conv2d(inputs=input_layer,
                            filters=32,
                            kernel_size=[3, 3],
                            kernel_initializer='xavier',
                            kernel_regularizer=tf.contrib.layers.l2_regularizer(1e-5),
                            padding="same",
                            activation=None) 
    ...
    

    In your loss function:

    onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=num_classes)
    loss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels, logits=logits)
    regularization_losses = tf.losses.get_regularization_losses()
    loss = tf.add_n([loss] + regularization_losses)
    
    0 讨论(0)
提交回复
热议问题