保存并加载keras模型

时间:2017-09-21 21:53:58

标签: python keras

我已经训练了一个模型,其中包括2 embeddings,其初始权重已经过预训练(使用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,
        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

通过互联网搜索解决方案是仅保存权重并再次定义模型(不包含compile)并分配已保存的权重。类似的东西:

model.save_weights("./model_weights.h5")

并在最后没有model.compile的情况下再次对模型进行区分:

embedding_layer1 = init_embedding(gensimWord2vecMatrix, "emb_1")
embedding_layer2 = init_embedding(gensimWord2vecMatrix2, "emb_2")
         .
         .
         .
model = Model(...
model.load_weights("./test_model.h5")

似乎工作正常,我可以使用预测功能。我的问题是使用这种方法的可训练嵌入会发生什么。预测函数是使用模型中的训练权重还是使用从gensim模型初始化的权重?因为要使用上面显示的load_weights,我将从头开始重新创建embeddings

有什么想法吗?我希望我的问题很明确。如果问题不可理解,任何评论都可用于重组问题。

1 个答案:

答案 0 :(得分:1)

如果您先创建嵌入并稍后加载权重,则加载权重将占优势(只要您之后不再调用init嵌入)。

您也可以进行手动检查。

创建模型,获取每个嵌入层权重:

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.