我正在寻找一种方法来重新初始化现有Keras预训练模型中某一层的权重。
我使用Python和Keras进行迁移学习,加载预训练的Keras模型时使用以下代码:
from keras.applications import vgg16, inception_v3, resnet50, mobilenetvgg_model = vgg16.VGG16(weights='imagenet')
我了解到,当使用的数据集与原始数据集非常不同时,可能有益于在已训练网络的低级特征上创建新层。
我找到了如何进行微调参数的方法,现在我正在寻找一种方法来重置选定的层,以便重新训练。我知道我可以创建一个新模型,并使用第n-1层作为输入,然后添加第n层,但我正在寻找一种方法来重置现有模型中现有层的参数。
回答:
无论出于何种原因,您可能希望重新初始化单个层k
的权重,以下是实现这一目标的一般方法:
from keras.applications import vgg16from keras import backend as Kvgg_model = vgg16.VGG16(weights='imagenet')sess = K.get_session()initial_weights = vgg_model.get_weights()from keras.initializers import glorot_uniform # 或者您选择的初始化器k = 30 # 假设是第30层new_weights = [glorot_uniform()(initial_weights[i].shape).eval(session=sess) if i==k else initial_weights[i] for i in range(len(initial_weights))]vgg_model.set_weights(new_weights)
您可以轻松验证initial_weights[k]==new_weights[k]
返回一个False
数组,而对于任何其他i
,initial_weights[i]==new_weights[i]
返回一个True
数组。