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

Mal*_*rec 28 tensorflow

在使用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
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Rob*_*cok 35

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

regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
layer2 = tf.layers.conv2d(
    inputs,
    filters,
    kernel_size,
    kernel_regularizer=regularizer)
Run Code Online (Sandbox Code Playgroud)

然后你应该将正则化损失添加到你的损失中,如下所示:

l2_loss = tf.losses.get_regularization_loss()
loss += l2_loss
Run Code Online (Sandbox Code Playgroud)

编辑:感谢Zeke Arneodo,Tom和srcolinas,我补充说,最后一点反馈,以便接受的答案提供完整的解决方案.

  • 我是否需要在最后一个损失层添加正则化器?比如`loss_new = loss_old + regularizer` (8认同)

小智 16

你的问题不是答案吗?您还可以使用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
Run Code Online (Sandbox Code Playgroud)