Извлечь кодер и декодер из обученного автоэнкодера - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу разделить обучение и применение автоэнкодера на две части, следуя https://blog.keras.io/building-autoencoders-in-keras.html и используя данные fashion-mnist для тестирования:

  1. Загрузите изображения, выполните примерку, котораяможет занять несколько часов или дней и использовать обратный вызов, чтобы сохранить лучшую модель автоэнкодера.Этот процесс может быть за несколько недель до следующей части.
  2. Используйте эту лучшую модель (вручную, выбранную по имени файла) и нанесите на карту исходное изображение, закодированное представление, сделанное кодером автоэнкодера, и прогнозирование с использованием декодераавтоассоциатор.У меня есть проблемы (см. Второй шаг) для извлечения слоев кодировщика и декодера из обученного и сохраненного автоэнкодера.

Для шаг первый У меня очень простая сеть, как указано ниже:

input_img = Input(shape=(784,))
# encoded representation
encoded = Dense(encoding_dim, activation='relu')(input_img)
# lossy reconstruction
decoded = Dense(784, activation='sigmoid')(encoded)

# full AE model: map an input to its reconstruction
autoencoder = Model(input_img, decoded)

# encoder: map an input to its encoded representation
encoder = Model(input_img, encoded)
# placeholder for an encoded input
encoded_input = Input(shape=(encoding_dim,))
# last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]
# decoder
decoder = Model(encoded_input, decoder_layer(encoded_input))

Сети:

autoencoder.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_5 (InputLayer)         (None, 784)               0         
_________________________________________________________________
dense_5 (Dense)              (None, 32)                25120     
_________________________________________________________________
dense_6 (Dense)              (None, 784)               25872     
=================================================================

и

encoder.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_5 (InputLayer)         (None, 784)               0         
_________________________________________________________________
dense_5 (Dense)              (None, 32)                25120     
=================================================================

Поэтому я обучаю модель и сохраняю ее на autoencoder.save('fashion-autoencoder.hdf5').В моем реальном примере я сохраняю его с помощью функции обратного вызова, поэтому обходной путь сохранения кодера и декодера не кажется реальным решением.Позже я загружаю изображения (не показаны) и делаю предсказания, такие как

# encode and decode some images from test set
encoded_imgs = encoder.predict(x_test)
decoded_imgs = decoder.predict(encoded_imgs)
# test the shape
print(encoded_imgs[0].shape)

и получаю форму (32,0).

Итак, давайте перейдем к двум шаг 2 где у меня есть свои проблемы.Я загружаю модель, используя

encoder= K.models.load_model('fashion-autoencoder.hdf5')
# delete the last layers to get the encoder
encoder.layers.pop()
encoder.summary() # show model data

, и кодер выглядит так же, как оригинал на первом этапе, что заставляет меня думать, что извлечение работает хорошо:

Layer (type)                 Output Shape              Param #   
=================================================================
input_5 (InputLayer)         (None, 784)               0         
_________________________________________________________________
dense_5 (Dense)              (None, 32)                25120     
=================================================================
Total params: 50,992
Trainable params: 50,992
Non-trainable params: 0

Но я также получаюпредупреждение

training.py:478: UserWarning: Discrepancy between trainable weights and collected trainable weights, did you set `model.trainable` without calling `model.compile` after ?
'Discrepancy between trainable weights and collected trainable'

, которое я понимаю в некотором роде, но не знаю, насколько это важно.Затем я снова загружаю изображения (не показаны) и использую кодировщик

encoded_imgs = encoder.predict(x_test)

# test the shape
print(encoded_imgs[0].shape)

, но при неправильной форме (784,).

Итак, мое извлечение для кодера не сработало, так какразмеры не верны.У меня даже меньше успехов при извлечении декодера (из авто-кодера сохранения), поскольку я не могу использовать push() и пробовал что-то вроде decoder = decoder.layers[-1:-2], но это не сработало.

Итак, мой общий вопрос - как извлечь детализагруженных моделей.

1 Ответ

0 голосов
/ 11 сентября 2018

Поскольку вы используете функциональный API для создания автоэнкодера, лучший способ восстановить кодер и декодер - это снова использовать функциональный API и класс Model:

autoencoder= K.models.load_model('fashion-autoencoder.hdf5')

encoder = Model(autoencoder.input, autoencoder.layers[-2].output)

decoder_input = Input(shape=(encoding_dim,))
decoder = Model(decoder_input, autoencoder.layers[-1](decoder_input))

encoder.summary()
decoder.summary()

Краткое описание моделей:

Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         (None, 784)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 32)                25120     
=================================================================
Total params: 25,120
Trainable params: 25,120
Non-trainable params: 0
_________________________________________________________________


Layer (type)                 Output Shape              Param #   
=================================================================
input_6 (InputLayer)         (None, 32)                0         
_________________________________________________________________
dense_4 (Dense)              (None, 784)               25872     
=================================================================
Total params: 25,872
Trainable params: 25,872
Non-trainable params: 0
_________________________________________________________________

Решение, включающее pop() для атрибута layers , не работает, так как вам нужно обновить некоторые внутренние атрибуты модели .Хотя для последовательных моделей был реализован встроенный метод pop().

...