Keras 中的全局权重衰减

Global Weight Decay in Keras

有没有办法在 Keras 中设置全局权重衰减?

我知道使用正则化器的层智能(https://keras.io/regularizers/),但我找不到任何关于设置全局权重衰减的方法的信息。

根据 github 回购协议 (https://github.com/fchollet/keras/issues/2717) 没有办法进行全局权重衰减。我在这里回答了,所以其他有同样问题的人就不用再找答案了。

要在 keras 中获得全局权重衰减,必须将正则化器添加到模型中的每一层。在我的模型中,这些层是批量归一化(beta/gamma 正则化器)和 dense/convolutions(W_regularizer/b_regularizer)层。

这里描述了逐层正则化:(https://keras.io/regularizers/).

无法立即对整个 keras 模型直接应用“全局”权重衰减。

但是,正如我所描述的 here,您可以通过遍历模型层并在适当的层上手动应用正则化器来对模型进行权重衰减。这是相关的代码片段:

model = keras.applications.ResNet50(include_top=True, weights='imagenet')
alpha = 0.00002  # weight decay coefficient

for layer in model.layers:
    if isinstance(layer, keras.layers.Conv2D) or isinstance(layer, keras.layers.Dense):
        layer.add_loss(lambda layer=layer: keras.regularizers.l2(alpha)(layer.kernel))
    if hasattr(layer, 'bias_regularizer') and layer.use_bias:
        layer.add_loss(lambda layer=layer: keras.regularizers.l2(alpha)(layer.bias))

发布在 Keras 模型上应用权重衰减的完整代码(受上述 post 启发):

# a utility function to add weight decay after the model is defined.
def add_weight_decay(model, weight_decay):
    if (weight_decay is None) or (weight_decay == 0.0):
        return

    # recursion inside the model
    def add_decay_loss(m, factor):
        if isinstance(m, tf.keras.Model):
            for layer in m.layers:
                add_decay_loss(layer, factor)
        else:
            for param in m.trainable_weights:
                with tf.keras.backend.name_scope('weight_regularizer'):
                    regularizer = lambda param=param: tf.keras.regularizers.l2(factor)(param)
                    m.add_loss(regularizer)

    # weight decay and l2 regularization differs by a factor of 2
    add_decay_loss(model, weight_decay/2.0)
    return