Michael
Michael

Reputation: 5897

How to get output from a specific layer in keras.tf, the bottleneck layer in autoencoder?

I am developing an autoencoder for clustering certain groups of images.

input_images->...->bottleneck->...->output_images

I have calibrated the autoencoder to my satisfaction and saved the model; everything has been developed using keras.tensorflow on python3.

The next step is to apply the autoencoder to a ton of images and cluster them according to cosine distance in the bottleneck layer. Oops, I just realized that I don't know the syntax in keras.tf for running the model on a batch up to a specific layer rather than to the output layer. Thus the question:

How do I run something like Model.predict_on_batch or Model.predict_generator up to the certain "bottleneck" layer and retrieve the values on that layer rather than the values on the output layer?

Upvotes: 1

Views: 899

Answers (2)

Vivek Prajapati
Vivek Prajapati

Reputation: 139

The full code would be like this,

# ENCODER
encoding_dim = 37310

input_layer = Input(shape=(encoding_dim,))

encoder = Dense(500, activation='tanh')(input_layer)
encoder = Dense(100, activation='tanh')(encoder)
encoder = Dense(50, activation='tanh', name='bottleneck_layer')(encoder)

decoder = Dense(100, activation='tanh')(encoder)
decoder = Dense(500, activation='tanh')(decoder)
decoder = Dense(37310, activation='sigmoid')(decoder)

# full model
model_full = models.Model(input_layer, decoder)
model_full.compile(optimizer='adam', loss='mse')
model_full.fit(x, y, epochs=20, batch_size=16)

# bottleneck model
bottleneck_output = model_full.get_layer('bottleneck_layer').output
model_bottleneck = models.Model(inputs = model_full.input, outputs = bottleneck_output)

bottleneck_predictions = model_bottleneck.predict(X_test)

Upvotes: 1

Daniel Möller
Daniel Möller

Reputation: 86600

You need to define a new model (if you didn't define the encoder and decoder as separate models initially, which is usually the easiest option).

If your model was defined without reusing layers, it's just:

inputs = model.input   
outputs= model.get_layer('bottleneck').output

encoder = Model(inputs, outputs)

Use the encoder model as any other model.

Upvotes: 2

Related Questions