【问题标题】:Add L2 regularization when using high level tf.layers使用高级 tf.layers 时添加 L2 正则化
【发布时间】:2017-10-29 04:14:54
【问题描述】:

是否可以在使用 tf.layers 中定义的层时添加 L2 正则化?

在我看来,由于 tf.layers 是一个高级包装器,因此没有简单的方法可以访问过滤器权重。

使用 tf.nn.conv2d

regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)

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

#Previous layers

...

#Second layer 
layer 2 = tf.nn.conv2d(
input,
weights,
[1,1,1,1],
[1,1,1,1])

#More layers
...

#Loss
loss = #some loss

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

现在使用 tf.layers.conv2d 会是什么样子?

谢谢!

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    您可以将它们传递给tf.layers.conv2d as arguments:

    regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
    layer2 = tf.layers.conv2d(
        inputs,
        filters,
        kernel_size,
        kernel_regularizer=regularizer)
    

    然后你应该像这样将正则化损失添加到你的损失中:

    l2_loss = tf.losses.get_regularization_loss()
    loss += l2_loss
    

    编辑:感谢我添加的 Zeke Arneodo、Tom 和 srcolinas,这是您反馈的最后一点,以便接受的答案提供完整的解决方案。

    【讨论】:

    • 我需要在最后一个损失层添加正则化器吗?喜欢loss_new = loss_old + regularizer
    • @TYL 你有没有把它加到最后一个损失层?
    • 你能扩展一下你的答案吗?
    • @thigi 没意识到,理论上应该加到最后一个loss里。
    • 您能否为这个答案添加更多细节?这似乎是正确的,但无助于努力理解代码的人
    【解决方案2】:

    你的问题不是答案吗?您也可以使用 tf.losses.get_regularization_loss (https://www.tensorflow.org/api_docs/python/tf/losses/get_regularization_loss),它将收集所有 REGULARIZATION_LOSSES。

    ...
    layer2 = tf.layers.conv2d(input, 
         filters, 
         kernel_size,                        
         kernel_regularizer= tf.contrib.layers.l2_regularizer(scale=0.1))
    ...
    l2_loss = tf.losses.get_regularization_loss()
    loss += l2_loss
    

    【讨论】:

      【解决方案3】:

      我看到两个不完整的答案,所以这里是完整的一个:

      regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
          layer2 = tf.layers.conv2d(
              inputs,
              filters,
              kernel_size,
              kernel_regularizer=regularizer)
      

      或者:

      layer2 = tf.layers.conv2d(inputs, 
           filters, 
           kernel_size,                        
           kernel_regularizer= tf.contrib.layers.l2_regularizer(scale=0.1))
      

      不要忘记将它添加到最终损失中:

      l2_loss = tf.losses.get_regularization_loss()
      ....
      loss += l2_loss
      

      基本上,在定义层时添加正则化,然后确保将正则化损失添加到损失中。

      【讨论】:

        【解决方案4】:

        在急切执行中,有两种方式。

        1. tf.add_n([tf.square(i) for i in layer.variables]) * l2_coef手工计算 .
        2. 使用kernel_regularizer 创建层时使用layer.losses

        如官方示例所示:densenet_test.py

        rand_input = tf.random_uniform((10, 3, 32, 32))
        weight_decay = 1e-4
        
        conv = tf.keras.layers.Conv2D(
            3, (3, 3),
            padding='same',
            use_bias=False,
            kernel_regularizer=tf.keras.regularizers.l2(weight_decay))
        
        optimizer = tf.train.GradientDescentOptimizer(0.1)
        conv(rand_input)  # Initialize the variables in the layer
        
        def compute_true_l2(vs, wd):
          return tf.reduce_sum(tf.square(vs)) * wd
        
        true_l2 = compute_true_l2(conv.variables, weight_decay)
        keras_l2 = tf.add_n(conv.losses)
        self.assertAllClose(true_l2, keras_l2)
        
        with tf.GradientTape() as tape_true, tf.GradientTape() as tape_keras:
          loss = tf.reduce_sum(conv(rand_input))
          loss_with_true_l2 = loss + compute_true_l2(conv.variables, weight_decay)
          loss_with_keras_l2 = loss + tf.add_n(conv.losses)
        
        true_grads = tape_true.gradient(loss_with_true_l2, conv.variables)
        keras_grads = tape_keras.gradient(loss_with_keras_l2, conv.variables)
        self.assertAllClose(true_grads, keras_grads)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-30
          • 1970-01-01
          • 1970-01-01
          • 2020-08-17
          • 1970-01-01
          • 2017-01-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多