【问题标题】:L2 regularization in tensorflow with high level API具有高级 API 的张量流中的 L2 正则化
【发布时间】:2017-12-07 15:06:16
【问题描述】:

我知道在 tensorflow 中使用 layer 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')

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 而 lets say I change my loss from nn.l2` 到 losses.mean_squared_error) 那么损失值有一个完全不同的范围,正则化器是如何适应的呢?还是那也是我的工作?
    • 好吧,我写了我必须这样做repeatedly 所以我总是有不止一个正则化器。使用tf.add_n 有什么好处?
    • 当你改变损失函数的尺度时,它有效地改变了你正则化的factorfactor 的最佳值通常在超参数优化期间找到。
    • 好的,所以基本上如果我改变我的损失函数,我也必须改变我的因素。非常感谢您的快速回答!
    • 所有方法都是等价的,为了完整起见,我只添加了一个。我个人会选择您的 1),因为它清晰简洁。
    猜你喜欢
    • 1970-01-01
    • 2017-10-29
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多