原本地址:
https://www.pythonheidong.com/blog/article/365893/78ee2e261bcc9957df4d/
上篇文章中介绍;
for layer in model.layers:
if hasattr(layer, 'moving_mean') and hasattr(layer, 'moving_variance'):
layer.trainable = True
K.eval(K.update(layer.moving_mean, K.zeros_like(layer.moving_mean)))
K.eval(K.update(layer.moving_variance, K.zeros_like(layer.moving_variance)))
else:
layer.trainable = False
但是上述代码有OOM风险。
在上篇文章中,keras的一个issue也提到了这个问题
https://github.com/keras-team/keras/issues/9214#issuecomment-422490253
issue中的一个评论
http://digital-thinking.de/keras-transfer-learning-for-image-classification-with-effificientnet/
仅训练BN层
for layer in xce.layers[:]:
layer.trainable = False
if layer.name.endswith('bn'):
layer.trainable = True
或者
https://zhuanlan.zhihu.com/p/124031503
he_normal = tf.keras.initializers.he_normal()
for layer in xce.layers:
if layer.name.endswith('_bn'):
new_weights = [
he_normal(layer.weights[0].shape), # Gamma
tf.zeros(layer.weights[1].shape), # Beta
tf.zeros(layer.weights[2].shape), # Mean
tf.ones(layer.weights[3].shape)] # Std
layer.set_weights(new_weights)
layer.trainable = True
else:
layer.trainable = False
如上代码还未测试,在测试后会将结果添加上。