在 tf.layers.conv2d 中将 kernel_regularizer 设置为 l2_regularizer 是什么意思?

Xia*_*eng 2 conv-neural-network tensorflow

我在其他问题中发现使用张量流在卷积网络中进行 L2 正则化的标准方法如下。

对于每个conv2d层,设置参数kernel_regularizerl2_regularizer这样的

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)

然后在损失函数中,收集reg损失

  reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
  reg_constant = 0.01  # Choose an appropriate one.
  loss = my_normal_loss + reg_constant * sum(reg_losses)
Run Code Online (Sandbox Code Playgroud)

包括我在内的很多人都犯了跳过第二步的错误。这意味着kernel_regularizer没有很好地理解的含义。我有一个我无法证实的假设。那是

通过设置kernel_regularizer单层,您告诉网络将这一层的内核权重转发到网络末端的损失函数,以便稍后您可以选择(通过您编写的另一段代码)将它们包含在损失函数中的最终正则化项。而已。

它是正确的还是有更好的解释?

nes*_*uno 6

将正则化器设置tf.layer.*为仅保留层权重的方法,应用正则化(这意味着仅在计算图中创建一个节点,该节点在此指定的权重集上计算此正则化,仅此而已)并将此节点添加到tf.GraphKeys.REGULARIZATION_LOSSES集合中。

之后,您的工作是获取此集合的元素并将其添加到您的损失中。

为此,您只需使用tf.losses.get_regularization_losses并总结所有返回的术语。

在您的代码中有一个错误,您不应添加额外的乘法常数,reg_constant * sum(reg_losses)因为在指定层的正则化时已经添加了该项。