我正在寻找一种在现有的keras预训练模型中重新初始化图层权重的方法。
我将python与keras结合使用,需要使用迁移学习, 我使用以下代码加载预先训练的keras模型
http://localhost:5001/helloapp/us-central1/app/login
我读到,当使用与原始数据集截然不同的数据集时,在训练网络中的较低层特征上创建新图层可能会有所帮助。
我找到了如何允许fine tuning参数的方法,现在我正在寻找一种重置选定图层以对其进行重新训练的方法。我知道我可以创建一个新模型并将n-1层用作输入并向其添加n层,但是我正在寻找一种方法来重置现有模型中现有层中的参数。
答案 0 :(得分:4)
无论出于何种原因,您可能想重新设置单个图层k
的权重,这是一种通用的方法:
from keras.applications import vgg16
from keras import backend as K
vgg_model = vgg16.VGG16(weights='imagenet')
sess = K.get_session()
initial_weights = vgg_model.get_weights()
from keras.initializers import glorot_uniform # Or your initializer of choice
k = 30 # say for layer 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
的数组,而其他任何initial_weights[i]==new_weights[i]
的{{1}}返回i
的数组。