在其他问题中,我发现使用张量流在卷积网络中进行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
,您正在告诉网络转发 该层的内核权重是网络末端的损失函数,例如 以后您将可以选择(通过编写的另一段代码)将它们包括在损失中的最终正则化项中 功能。没什么。
是正确的还是有更好的解释?
答案 0 :(得分:4)
将正则化器设置为tf.layer.*
意味着仅保留层权重,应用正则化(这意味着仅在计算图中创建一个节点,该节点根据指定的权重集对此正则化进行计算,仅此而已)并将此节点添加到tf.GraphKeys.REGULARIZATION_LOSSES
集合中。
此后,您的工作就是获取此集合的元素并将其添加到您的损失中。
为此,您只需使用tf.losses.get_regularization_losses
并对所有返回的术语求和即可。
在您的代码中有一个错误,您不应添加其他乘法常数reg_constant * sum(reg_losses)
,因为在为图层指定正则化时已经添加了该术语。
答案 1 :(得分:0)
对于Tensorflow> 2.0
model.losses
tf.math.add_n(model.losses)
,如图here