Charger les poids pour la dernière couche (couche de sortie) vers un nouveau modèle à partir du réseau formé

Aug 18 2020

Est-il possible de charger les poids vers la dernière couche de mon nouveau modèle à partir d'un réseau formé en utilisant le schéma set_weights et get_weights? Le fait est que j'ai enregistré le poids de chaque calque sous forme de fichier de tapis (après l'entraînement) pour effectuer un calcul dans Matlab et je veux que seuls les poids modifiés du dernier calque soient chargés dans le dernier calque de mon nouveau modèle et d'autres calques obtenir les mêmes poids que le modèle entraîné. C'est un peu délicat, car le format enregistré est mat.

weights1 = lstm_model1.layers[0].get_weights()[0]
biases1 = lstm_model1.layers[0].get_weights()[1]
weights2 = lstm_model1.layers[2].get_weights()[0]
biases2 = lstm_model1.layers[2].get_weights()[1]
weights3 = lstm_model1.layers[4].get_weights()[0]
biases3 = lstm_model1.layers[4].get_weights()[1]
# Save the weights and biases for adaptation algorithm 
savemat("weights1.mat", mdict={'weights1': weights1})  
savemat("biases1.mat", mdict={'biases1': biases1})      
savemat("weights2.mat", mdict={'weights2': weights2})   
savemat("biases2.mat", mdict={'biases2': biases2})      
savemat("weights3.mat", mdict={'weights3': weights3}) 
savemat("biases3.mat", mdict={'biases3': biases3})  

Comment puis-je charger uniquement les anciens poids des autres couches dans le nouveau modèle (sans la dernière couche) et les poids modifiés de la dernière couche à la dernière couche dans le nouveau?

Réponses

1 RyanRudes Aug 24 2020 at 13:41

S'il a été enregistré au format de fichier .h5, cela fonctionne. Cependant, je ne suis pas sûr de .mat:

Dans la simplicité, il suffit d'appeler get_weightsle calque souhaité, et de même, set_weightsle calque correspondant de l'autre modèle:

last_layer_weights = old_model.layers[-1].get_weights()
new_model.layers[-1].set_weights(last_layer_weights)

Pour un exemple de code plus complet, allez-y:

# Create an arbitrary model with some weights, for example
model = Sequential(layers = [
    Dense(70, input_shape = (100,)),
    Dense(60),
    Dense(50),
    Dense(5)])

# Save the weights of the model
model.save_weights(“model.h5”)

# Later, load in the model (we only really need the layer in question)
old_model = Sequential(layers = [
    Dense(70, input_shape = (100,)),
    Dense(60),
    Dense(50),
    Dense(5)])

old_model.load_weights(“model.h5”)

# Create a new model with slightly different architecture (except for the layer in question, at least)
new_model = Sequential(layers = [
    Dense(80, input_shape = (100,)),
    Dense(60),
    Dense(50),
    Dense(5)])

# Set the weights of the final layer of the new model to the weights of the final layer of the old model, but leaving other layers unchanged.
new_model.layers[-1].set_weights(old_model.layers[-1].get_weights())

# Assert that the weights of the final layer is the same, but other are not.
print (np.all(new_model.layers[-1].get_weights()[0] == old_model.layers[-1].get_weights()[0]))
>> True

print (np.all(new_model.layers[-2].get_weights()[0] == old_model.layers[-2].get_weights()[0]))
>> False