Проблемы расщепления модели автоэнкодера в Керасе - PullRequest
0 голосов
/ 24 апреля 2019

Я обучил автоэнкодеру и сохранил его, используя встроенный в save () метод keras.Теперь я хочу разделить его на две части: кодировщик и декодер.Я могу успешно загрузить модель и получить часть кодировщика, создав новую модель, используя старую модель:

encoder_model = keras.models.Model(inputs=self.model.input, 
 outputs=self.model.get_layer(layer_of_activations).get_output_at(0))

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

    for i, l in enumerate(self.model.layers[0:19]):
        self.model.layers.pop(0)
    newInput = Input(batch_shape=(None, None, None, 64))
    newOutputs = self.model(newInput)
    newModel = keras.models.Model(newInput, newOutputs)

Форма вывода последнего слоя, который я удаляю, - (Нет,Нет, Нет, 64), но этот код выдает следующую ошибку:

ValueError: number of input channels does not match corresponding dimension of filter, 64 != 3

Я предполагаю, что это потому, что входные размеры модели не обновляются после выталкивания исходных слоев, что отмечено в первом вопросе этого вопроса.ответ, второй комментарий: Keras, заменяющий входной слой

Простое зацикливание слоев и воссоздание их в новой модели не работает, так как моя модель не последовательная.

1 Ответ

0 голосов
/ 25 апреля 2019

Я решил эту проблему, создав новую модель с точно такой же архитектурой, что и в части декодера исходной сети автоэнкодеров, а затем просто скопировал веса.

Вот код:

    # Looping through the old model and popping the encoder part + encoded layer
    for i, l in enumerate(self.model.layers[0:19]): 
        self.model.layers.pop(0)

    # Building a clean model that is the exact same architecture as the decoder part of the autoencoder
    new_model = nb.build_decoder()

    # Looping through both models and setting the weights on the new decoder
    for i, l in enumerate(self.model.layers):
        new_model.layers[i+1].set_weights(l.get_weights())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...