Xia*_*eng 2 conv-neural-network tensorflow
我在其他问题中发现使用张量流在卷积网络中进行 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)
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
单层,您告诉网络将这一层的内核权重转发到网络末端的损失函数,以便稍后您可以选择(通过您编写的另一段代码)将它们包含在损失函数中的最终正则化项。而已。
它是正确的还是有更好的解释?
将正则化器设置tf.layer.*
为仅保留层权重的方法,应用正则化(这意味着仅在计算图中创建一个节点,该节点在此指定的权重集上计算此正则化,仅此而已)并将此节点添加到tf.GraphKeys.REGULARIZATION_LOSSES
集合中。
之后,您的工作是获取此集合的元素并将其添加到您的损失中。
为此,您只需使用tf.losses.get_regularization_losses
并总结所有返回的术语。
在您的代码中有一个错误,您不应添加额外的乘法常数,reg_constant * sum(reg_losses)
因为在指定层的正则化时已经添加了该项。
归档时间: |
|
查看次数: |
2934 次 |
最近记录: |