2017-07-01 3 views
1

Ich habe eine Trainingseinheit gemacht, die 70% acc bekam und ihre Gewichte speicherte.Wie setze ich die Gewichte auf eine Schicht nur auf der ersten Hälfte der Neuronen in Keras?

Ich möchte jetzt diese Gewichte, von einem LSTM dieses Modell mit (32, 32, 16) Ausgänge für jede der drei Schichten auf das gleiche Modell, aber mit (64, 64, 32) Ausgänge zu laden. Es gibt 4 Schichten und die letzte ist eine Softmax mit 8 Ausgängen und hat sich nicht verändert.

Wie kann ich die "erste Hälfte" der Gewichte in dieses neue Modell laden?

Ich versuche die letzte Trainingseinheit zu benutzen, um das Netzwerk von irgendwo zu starten, da die Trainingszeit so viel höher ist und meine Grafikkarte nicht so gut zum Training ist und viel Zeit in Anspruch nimmt.

Antwort

1

Sie können die Gewichte in dem gleichen Modell laden (nicht das große Modell, das kleinen), oder Sie können sie als numpy Arrays einfach geladen werden (ich bin nicht sehr verwendet in Keras zu Speichern und Laden)

wenn Sie die Gewichte im Modell geladen wird, um die Schichten zu finden und die Gewichte als numpy Arrays erhalten:

#for each layer: 
weightsAndBiases = smallModel.layers[i].get_weights() 
    #this is a list with [weights, biases] for the layer i, 
    #may have more elements depending on the type of layer 

Dann, wenn Sie das größere Modell von einigen keras initialisiert beginnen sollen (wahrscheinlich besser als Nullen oder Einsen oder eine manuelle Initialisierung), nehmen Sie die Gewichte aus dem großen Modell, nachdem Sie es erstellen:

bigWandB = bigModel.layers[i].get_weights() 
    #if not, just create a numpy array with the right shape 

Übertragen Sie jetzt Daten von weightsAndBiases zu bigWandB.

In diesem Beispiel wird die Form verwendet, die Sie angegeben haben. Sie sollten jedoch die Form jedes Arrays überprüfen. Sie stimmen nicht mit der Ausgabe überein und jede Art von Layer hat ihre eigene Form. (Bitte beachten Sie, dass einige Schichten haben nur ein Array, einige können zwei, die klassischen Gewichte und Vorurteile, und die LSTM Schichten wahrscheinlich 3 haben - überprüfen Sie die Länge der Liste):

bigWandB[0][:32,:32,:16] = weightsAndBiases[0] #weights for one layer 
bigWandB[1][:32,:32,:16] = weightsAndBiases[1] #biases for the same layer 

Jetzt ist es eingestellt wieder zur Zielebene:

bigModel.layers[i].set_weights(bigWandB) 
+0

Ich habe überlegt, meinen Keras-Code auf Tensorflow umzustellen. Da ich die Gewichte schon habe, kann ich etwas tun, was du gesagt hast. Es scheint machbar. Ich versuche das zu tun, was du gesagt hast, aber benutze Keras nur, aber wenn ich nicht in der Lage bin, werde ich meinen Code auf Tensorflow umstellen und es erneut versuchen. Ich werde so bald wie möglich aktualisieren – Victor

Verwandte Themen