python - 具有高级 API 的 tensorflow 中的 L2 正则化

标签 python machine-learning tensorflow neural-network deep-learning

我知道关于使用来自 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')

最佳答案

第一种方法是正确的。另一种方法是通过 tf.add_n 函数:

reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss = tf.add_n([base_loss] + reg_losses, name="loss")

第二种方法也有效,但您必须定义一个单个正则化器。所以它适用于您的情况,但如果您在不同的层中使用不同的正则化器,可能会带来不便。

关于python - 具有高级 API 的 tensorflow 中的 L2 正则化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47697988/

相关文章:

python - 将圆柱体拟合到分散的 3D XYZ 点数据

python - 委托(delegate)与继承python

python - 如何根据损失精​​度和召回率确定过拟合模型

python - 变换预测目标

python - 如何在 Keras 的函数式 API 中构建以嵌套模型的一层结尾的子模型

python-3.x - tf.gradients() 是如何工作的?

python - 可以在基于 TensorFlow docker 镜像的 docker 容器中使用 python 3.5 吗?

python - 如何有效地将运算符应用于两个数组的笛卡尔积?

python - Python 机器学习算法的扩展性如何?

python - 自定义丢失问题 : inputs to eager execution function cannot be keras symbolic tensors but found