Tho*_*etz 9 python neural-network deep-learning keras
有没有办法在Keras设置全球减重?
我知道使用正规化器(https://keras.io/regularizers/)的分层智能,但我找不到任何关于设置全局权重衰减的方法的信息.
Tho*_*etz 10
根据github repo(https://github.com/fchollet/keras/issues/2717),没有办法进行全局权重衰减.我在这里回答,所以其他有同样问题的人不必为了回答而感到满意.
为了在keras中获得全局权重衰减,必须将正则化器添加到模型中的每个层.在我的模型中,这些层是批量标准化(β/γ正则化器)和密集/卷积(W_regularizer/b_regularizer)层.
这里描述了层次正则化:(https://keras.io/regularizers/).
无法立即将“全局”权重衰减直接应用于整个keras模型。
但是,正如我在这里描述的,您可以通过遍历模型的各层并在适当的层上手动应用正则化函数来对模型进行权重衰减。以下是相关的代码段:
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))
Run Code Online (Sandbox Code Playgroud)
小智 5
发布在 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 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6544 次 |
最近记录: |