Python 保存和加载keras模型
我已经训练了一个模型,其中包括2个具有预先训练的初始权重(使用gensim)的嵌入。这两个嵌入都具有Python 保存和加载keras模型,python,keras,Python,Keras,我已经训练了一个模型,其中包括2个具有预先训练的初始权重(使用gensim)的嵌入。这两个嵌入都具有trainable=True,这意味着权重将在训练中更新。模型如下所示: def init_embedding(emb_matrix, name): embedding_layer = Embedding( emb_matrix.shape[0], emb_matrix.shape[1], weights=[emb_matrix],
trainable=True
,这意味着权重将在训练中更新。模型如下所示:
def init_embedding(emb_matrix, name):
embedding_layer = Embedding(
emb_matrix.shape[0],
emb_matrix.shape[1],
weights=[emb_matrix],
trainable=True,
name=name)
return embedding_layer
embedding_layer1 = init_embedding(gensimWord2vecMatrix, "emb_1")
embedding_layer2 = init_embedding(gensimWord2vecMatrix2, "emb_2")
sequence_input_1 = Input(shape=(10,), dtype='int32', name="input_1")
sequence_input_2 = Input(shape=(1,), dtype='int32', name="input_2")
sequence_input_3 = Input(shape=(100,), dtype='int32', name="input_3")
embedded_sequences_1 = embedding_layer1(sequence_input_1)
embedded_sequences_2 = embedded_layer2(sequence_input_1)
embedded_sequences_3 = embedded_layer2(sequence_input_3)
conv_step1 = Convolution1D(filters=1000,kernel_size=5,activation=activation_fun,name="conv_layer_",padding="valid")(embedded_sequences_1)
.
.
z = Dense(ashape, activation="linear", name="predicted_description")(conv_step10)
loss = a_loss([z, embedded_sequences_2, embedded_sequences_3])# a loss function
model = Model(
inputs=[sequence_input_1, sequence_input_2, sequence_input_],
outputs=[loss])
model.compile(loss=mean_loss, optimizer=Adam())
我要做的是保存/加载模型。我首先尝试的是:
model.save("./test_model.h5")
但在我使用之后:
from keras.models import load_model
model = load_model("./test_model.h5")
我得到一个错误:ValueError:Missing layer:x
通过互联网搜索解决方案是只保存权重,然后再次定义模型(不使用编译
)并分配保存的权重。比如:
model.save_weights("./model_weights.h5")
再次定义模型,但不使用模型。最后编译:
embedding_layer1 = init_embedding(gensimWord2vecMatrix, "emb_1")
embedding_layer2 = init_embedding(gensimWord2vecMatrix2, "emb_2")
.
.
.
model = Model(...
model.load_weights("./test_model.h5")
这似乎很好,我可以使用预测功能。我的问题是使用这种方法的可训练嵌入会发生什么。预测函数是使用模型中经过训练的权重,还是使用gensim模型初始化的权重?因为要使用如上所示的load\u权重
,我从一开始就在重新创建嵌入
有什么想法吗?我希望我的问题是清楚的。如果问题不可理解,则任何注释都有助于重新构造问题。如果先创建嵌入,然后加载权重,则加载的权重将占优势(只要此后不调用init embedding)
您也可以进行手动检查
创建模型,获取每个嵌入层的权重:
w1 = model.get_layer('embeddingName1').get_weights()
#same for 2 and 3
加载权重并从层中再次获取权重:
newW1 = model.get_layer('embeddingName1').get_weights()
比较它们:
for w,newW in zip(w1,newW1):
print((w==newW).all()) #if false, weights have changed with loading
#same for 2 and 3.
准确地发布您用来定义模型的代码是一个好主意。嵌入不是其中的一部分吗?@DanielMöller我更新了一点问题:)因此在第二次运行(加载模型时)中,随机初始化嵌入或使用预先训练的权重初始化并不重要,因为它们无论如何都会从load\u weights
中被覆盖。对吗?是的:)--加载权重将覆盖所有内容。