Я хочу разделить обучение и применение автоэнкодера на две части, следуя https://blog.keras.io/building-autoencoders-in-keras.html и используя данные fashion-mnist для тестирования:
- Загрузите изображения, выполните примерку, котораяможет занять несколько часов или дней и использовать обратный вызов, чтобы сохранить лучшую модель автоэнкодера.Этот процесс может быть за несколько недель до следующей части.
- Используйте эту лучшую модель (вручную, выбранную по имени файла) и нанесите на карту исходное изображение, закодированное представление, сделанное кодером автоэнкодера, и прогнозирование с использованием декодераавтоассоциатор.У меня есть проблемы (см. Второй шаг) для извлечения слоев кодировщика и декодера из обученного и сохраненного автоэнкодера.
Для шаг первый У меня очень простая сеть, как указано ниже:
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]
, но это не сработало.
Итак, мой общий вопрос - как извлечь детализагруженных моделей.