使用高级tf.layers时添加L2正则化
tensorflow
9
0

使用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会是什么样?

谢谢!

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

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

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

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

收藏
评论

您的问题不是答案吗?您还可以使用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
收藏
评论

您可以将它们作为参数传递到tf.layers.conv2d中:

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,我补充了您反馈的最后一点,以便接受的答案提供了完整的解决方案。

收藏
评论

在渴望执行中,有两种方法。

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

如官方示例所示: densitynet_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)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号