如何为传输学习重置特定的图层权重?

时间:2018-09-20 12:38:04

标签: machine-learning neural-network keras deep-learning conv-neural-network

我正在寻找一种在现有的keras预训练模型中重新初始化图层权重的方法。

我将python与keras结合使用,需要使用迁移学习, 我使用以下代码加载预先训练的keras模型

http://localhost:5001/helloapp/us-central1/app/login

我读到,当使用与原始数据集截然不同的数据集时,在训练网络中的较低层特征上创建新图层可能会有所帮助。

我找到了如何允许fine tuning参数的方法,现在我正在寻找一种重置选定图层以对其进行重新训练的方法。我知道我可以创建一个新模型并将n-1层用作输入并向其添加n层,但是我正在寻找一种方法来重置现有模型中现有层中的参数。

1 个答案:

答案 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的数组。