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

时间:2018-08-04 07:31:09

标签: tensorflow conv-neural-network

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

对于每个conv2d层,将参数kernel_regularizer设置为l2_regularizer

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

然后在损失功能中,收集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)

包括我在内的许多人在跳过第二步时犯了错误。这意味着对kernel_regularizer的含义了解得不多。我有一个我无法确认的假设。那是

  

通过为单个图层设置kernel_regularizer,您正在告诉网络转发   该层的内核权重是网络末端的损失函数,例如   以后您将可以选择(通过编写的另一段代码)将它们包括在损失中的最终正则化项中   功能。没什么。

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

2 个答案:

答案 0 :(得分:4)

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

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

为此,您只需使用tf.losses.get_regularization_losses并对所有返回的术语求和即可。

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

答案 1 :(得分:0)

对于Tensorflow> 2.0