Извлечение моделей кодирования / декодирования из автоэнкодера Keras с использованием Sequential API - PullRequest
0 голосов
/ 19 декабря 2018

Я обучаю автоэнкодеру, построенному с использованием Sequential API в Keras.Я хотел бы создать отдельные модели, которые реализуют функции кодирования и декодирования.Из примеров я знаю, как это сделать с помощью функционального API, но я не могу найти пример того, как это делается с помощью последовательного API.Следующий пример кода - моя отправная точка:

input_dim = 2904
encoding_dim = 4
hidden_dim = 128

# instantiate model
autoencoder = Sequential()

# 1st hidden layer    
autoencoder.add(Dense(hidden_dim, input_dim=input_dim, use_bias=False))
autoencoder.add(BatchNormalization())
autoencoder.add(Activation('elu'))
autoencoder.add(Dropout(0.5))

# encoding layer    
autoencoder.add(Dense(encoding_dim, use_bias=False))
autoencoder.add(BatchNormalization())
autoencoder.add(Activation('elu'))
# autoencoder.add(Dropout(0.5))

# 2nd hidden layer    
autoencoder.add(Dense(hidden_dim, use_bias=False))
autoencoder.add(BatchNormalization())
autoencoder.add(Activation('elu'))
autoencoder.add(Dropout(0.5))

# output layer
autoencoder.add(Dense(input_dim))

Я понимаю, что могу выбирать отдельные слои, используя autoencoder.layer[i], но я не знаю, как связать новую модель с диапазоном таких слоев.Я наивно пробовал следующее:

encoder = Sequential()
for i in range(0,7):
    encoder.add(autoencoder.layers[i])

decoder = Sequential()
for i in range(7,12):
    decoder.add(autoencoder.layers[i])


print(encoder.summary())
print(decoder.summary())

, который, казалось бы, работал для части кодера (было показано правильное резюме), но часть декодера выдавала ошибку:

This model has not yet been built. Build the model first by calling build() or calling fit() with some data. Or specify input_shape or batch_input_shape in the first layer for automatic build.

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Другой способ, который также работает.

input_img = Input(shape=(encoding_dim,))
previous_layer = input_img
for i in range(bottleneck_layer,len(autoencoder.layers)): # bottleneck_layer = index of bottleneck_layer + 1!
    next_layer = autoencoder.layers[i](previous_layer)
    previous_layer = next_layer
decoder = Model(input_img, next_layer)
0 голосов
/ 19 декабря 2018

Поскольку входная форма для среднего слоя (т. Е. Здесь я имею в виду autoencoder.layers[7]) не задана явно, при добавлении ее в другую модель в качестве первого слоя эта модель не будет построена автоматически (т.е. процесс построениявключает построение тензора веса для слоев в модели).Поэтому вам нужно явно вызвать метод build и установить форму ввода:

decoder.build(input_shape=(None, encoding_dim))   # note that batch axis must be included

В качестве примечания, нет необходимости вызывать print для model.summary(), так каквыдаст результат сам.

...