在TensorFlow中使用高级API的L2正则化

3

我知道关于使用TensorFlow的层API进行L2正则化有一些类似的问题,但是对我来说仍然不太清楚。

首先,我像这样在我的conv2d层中多次设置kernel_regularizer

regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
tf.layers.conv2d(kernel_regularizer=)

然后我可以使用以下方式收集所有的正则化损失:
regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)

最后但同样重要的是,我需要将正则化项加入到最终损失函数中。然而,在这里我不太确定该怎么做,以下哪一个是正确的?

1) loss = loss + factor * tf.reduce_sum(regularization_losses)

2) loss = loss + tf.contrib.layers.apply_regularization(regularizer, weights_list=regularization_losses)

或者它们两个都错了吗?第二种选择似乎很奇怪,因为我必须再次将正则化器作为参数传递,尽管每层已经有一个正则化器作为参数。

编辑

loss_1 = tf.losses.mean_squared_error(labels=y, predictions=logits, weights=1000)

regularization_loss = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)

loss = tf.add_n([loss_1] + regularization_loss, name='loss')
1个回答

1
第一种方法是正确的。另一种方法是通过tf.add_n函数实现:
reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss = tf.add_n([base_loss] + reg_losses, name="loss")

第二种方法也是可行的,但您需要定义一个单一的正则化器。因此在您的情况下可以使用,但如果您在不同的层中使用不同的正则化器,则可能会不方便。

假设我将我的损失函数从nn.l2更改为losses.mean_squared_error,那么损失值的范围完全不同,正则化器如何适应这种情况?还是说这也是我的工作? - user4911648
1
当您改变损失函数的规模时,它实际上会改变您正则化的“因子”。通常在超参数优化期间找到“因子”的最佳值。 - Maxim
FYI:当我使用以下代码时出现了错误:tf.add_n([base_loss] + reg_losses, name="loss") --> TypeError: Using a tf.Tensor as a Python bool is not allowed. - user4911648
@thigi 嗯,这对我有效。你能把你的脚本发布到gist上吗?这样我就可以重现它了。 - Maxim
我已经编辑了我的答案,并添加了我的损失计算代码。 - user4911648
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接