2017-09-21 2 views
0

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.

+0

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? –

+0

@ DanielMöller Ich habe ein bisschen die Frage aktualisiert :) –

Antwort

1

Wenn Sie zuerst die Einbettungen erstellen und später die Gewichtungen, dann haben die geladenen Gewichtungen Vorrang (solange Sie danach keine init-Einbettung aufrufen).

Sie können auch eine manuelle Überprüfung durchführen.

das Modell erstellen, die jeweils Einbettungsschichtgewichte erhalten:

w1 = model.get_layer('embeddingName1').get_weights() 
#same for 2 and 3 

Legen Sie die Gewichte und sie von den Schichten wieder bekommen:

newW1 = model.get_layer('embeddingName1').get_weights() 

sie vergleichen:

for w,newW in zip(w1,newW1): 
    print((w==newW).all()) #if false, weights have changed with loading 

#same for 2 and 3. 
+0

Also im zweiten Lauf (beim Laden des Modells) spielt es keine Rolle, ob ich die Einbettungen zufällig initialisiere oder mit den vortrainierten Gewichten initialisiere, da diese sowieso überschrieben werden von 'load_weights'. Recht? –

+0

Ja :) - Das Laden der Gewichte überschreibt alles. –

Verwandte Themen