Ich habe ein Modell trainiert, das unter anderem 2 embeddings
hat, die Anfangsgewichte vortrainiert haben (mit Gensim). Beide Einbettungen haben trainable=True
, was bedeutet, dass die Gewichte im Training aktualisiert werden. Das Modell ist etwas wie das Folgende:Speichern und Laden eines Keras-Modells
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())
und was ich versuche zu tun ist, um das Modell zu speichern/laden. Das erste, dass ich versucht war:
model.save("./test_model.h5")
Aber nach, wenn ich benutze:
from keras.models import load_model
model = load_model("./test_model.h5")
ich einen Fehler von bekam: ValueError: Missing layer: x
Suche über das Internet eine Lösung nur zu sparen, ist die gewichten und definieren Sie erneut das Modell (ohne compile
) und weisen Sie die gespeicherten Gewichte zu. Etwas wie:
model.save_weights("./model_weights.h5")
und wieder difining das Modell ohne die model.compile
am Ende:
embedding_layer1 = init_embedding(gensimWord2vecMatrix, "emb_1")
embedding_layer2 = init_embedding(gensimWord2vecMatrix2, "emb_2")
.
.
.
model = Model(...
model.load_weights("./test_model.h5")
das scheint gut zu funktionieren und ich kann die Funktion vorhersagen verwenden. Meine Frage ist, was mit den trainierbaren Einbettungen mit dieser Methode passiert. Verwenden die Vorhersagefunktionen die trainierten Gewichte des Modells oder die Gewichte, die vom Gensim-Modell initialisiert werden? Weil ich die load_weights
wie oben gezeigt benutze, erstelle ich die embeddings
von Anfang an.
Irgendeine Idee? Ich hoffe meine Frage war klar. Jeder Kommentar ist nützlich für die Umstrukturierung der Frage, wenn es nicht verständlich ist.
Es wäre Es ist eine gute Idee, genau den Code zu posten, mit dem Sie Ihr Modell definieren. Sind die Einbettungen nicht ein Teil davon? –
@ DanielMöller Ich habe ein bisschen die Frage aktualisiert :) –