Cargue pesos para la última capa (capa de salida) a un nuevo modelo de la red entrenada
¿Es posible cargar los pesos en la última capa en mi nuevo modelo desde la red entrenada usando el esquema set_weights y get_weights? El punto es que guardé el peso de cada capa como un archivo de tapete (después del entrenamiento) para hacer algunos cálculos en Matlab y quiero que solo los pesos modificados de la última capa se carguen en la última capa en mi nuevo modelo y otras capas obtenga los mismos pesos que el modelo entrenado. Es un poco trickey, ya que el formato guardado es 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})
¿Cómo puedo cargar solo los pesos antiguos de otras capas en el nuevo modelo (sin la última capa) y los pesos modificados de la última capa en la última capa en la nueva?
Respuestas
Si se guardó en formato de archivo .h5, esto funciona. Sin embargo, no estoy seguro de .mat:
En simplicidad, solo tiene que llamar get_weights
a la capa deseada, y de manera similar, set_weights
a la capa correspondiente del otro modelo:
last_layer_weights = old_model.layers[-1].get_weights()
new_model.layers[-1].set_weights(last_layer_weights)
Para obtener una muestra de código más completa, aquí tienes:
# 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