我已经训练了一个模型,其中包括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
。
有什么想法吗?我希望我的问题很明确。如果问题不可理解,任何评论都可用于重组问题。
答案 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.