Estrai sottorete dal modello sequenziale di Keras
Ho addestrato una rete di autoencoder molto semplice simile a questo esempio:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
layers.Dense(128, activation="relu"),
layers.Dense(64, activation="relu"),
layers.Dense(32, activation="relu"),
layers.Dense(16, activation="relu"),
layers.Dense(8, activation="relu", name="latent_space"),
layers.Dense(16, activation="relu"),
layers.Dense(32, activation="relu", name="decode_32"),
layers.Dense(64, activation="relu"),
layers.Dense(128, activation="sigmoid"),
])
model.compile(...)
model.fit(...)
# Extract subnetwork here after training
Vorrei sapere se è possibile fornire dati al latent_space
layer in modo tale da poter estrarre successivamente le attivazioni dal layer decode_32
? Idealmente vorrei crop
una sottorete dopo l'allenamento con il latent_space
livello come input e il decode_32
livello come livello di output. È possibile?
Risposte
Fa questa risposta si adatta alla tua domanda?
def extract_layers(main_model, starting_layer_ix, ending_layer_ix) :
# create an empty model
new_model = Sequential()
for ix in range(starting_layer_ix, ending_layer_ix + 1):
curr_layer = main_model.get_layer(index=ix)
# copy this layer over to the new model
new_model.add(curr_layer)
return new_model
Se preferisci selezionare la tua sottorete con i nomi del primo e dell'ultimo layer, il get_layermetodo ha anche un argomento per il nome del layer, ma una soluzione più semplice sarebbe recuperare gli indici dei layer da selezionare grazie layer.name
all'argomento.
In questo modo, devi solo modificare la funzione precedente aggiungendo
layer_names = [layer.name for layer in main_model.layers]
starting_layer_ix = layer_names.index(starting_layer_name)
ending_layer_ix = layer_names.index(ending_layer_name)