Ekstrak subnetwork dari model Keras Sequential
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
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)