Python 保存和加载keras模型

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],

我已经训练了一个模型,其中包括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,
        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
中被覆盖。对吗?是的:)--加载权重将覆盖所有内容。