我知道有一些关于使用tensorflow的层API进行l2正则化的类似问题,但对我来说仍然不太清楚。
首先,我在kernel_regularizer
图层中重复设置conv2d
,如下所示:
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')
答案 0 :(得分:1)
第一种方法是正确的。另一种方法是通过tf.add_n
函数:
reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss = tf.add_n([base_loss] + reg_losses, name="loss")
第二种方法也有效,但您必须定义单正则化器。因此它适用于您的情况,但如果您在不同的层中使用不同的正则化器,可能会很不方便。