有没有办法在Keras设置全局减重?
我知道使用正规化器(https://keras.io/regularizers/)的分层智能,但我找不到任何关于设置全局权重衰减的方法的信息。
答案 0 :(得分:8)
根据github repo(https://github.com/fchollet/keras/issues/2717),没有办法进行全局权重衰减。我在这里回答了这个问题,所以其他有同样问题的人不必为了回答而感到满意。
要在keras中获得全局权重衰减,必须将正则化器添加到模型中的每个层。在我的模型中,这些层是批量标准化(β/γ正则化器)和密集/卷积(W_regularizer / b_regularizer)层。
这里描述了层次正则化:(https://keras.io/regularizers/)。
答案 1 :(得分:3)
无法直接将“全局”权重衰减直接应用于整个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(keras.regularizers.l2(alpha)(layer.kernel))
if hasattr(layer, 'bias_regularizer') and layer.use_bias:
layer.add_loss(keras.regularizers.l2(alpha)(layer.bias))
答案 2 :(得分:0)
发布完整的代码以在Keras模型上应用权重衰减(上面的帖子所暗示):
# 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: 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