Ekstrak subnetwork dari model Keras Sequential

Aug 24 2020

Saya melatih jaringan autoencoder yang sangat sederhana yang mirip dengan contoh ini:

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

Saya ingin tahu apakah mungkin untuk memasukkan data ke latent_spacelapisan sehingga saya kemudian dapat mengekstrak aktivasi dari lapisan decode_32? Idealnya saya ingin cropsubnetwork setelah pelatihan dengan latent_spacelapisan sebagai masukan dan decode_32lapisan sebagai lapisan keluaran. Apakah itu mungkin?

Jawaban

1 RandomGuy Aug 24 2020 at 03:02

Apakah jawaban ini sesuai dengan pertanyaan Anda?

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 

Jika Anda lebih suka memilih subnetwork Anda dengan nama lapisan pertama dan terakhir, get_layermetode ini juga memiliki argumen untuk nama lapisan, tetapi solusi yang lebih mudah adalah mengambil indeks lapisan untuk dipilih berkat layer.nameargumen.

Dengan begitu, Anda hanya perlu memodifikasi fungsi sebelumnya dengan menambahkan

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)