Estrai sottorete dal modello sequenziale di Keras

Aug 24 2020

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_spacelayer in modo tale da poter estrarre successivamente le attivazioni dal layer decode_32? Idealmente vorrei cropuna sottorete dopo l'allenamento con il latent_spacelivello come input e il decode_32livello come livello di output. È possibile?

Risposte

1 RandomGuy Aug 24 2020 at 03:02

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.nameall'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)