Загрузка предварительно обученной модели Keras и объединение с моделью ветвления для создания мульти-ввода - PullRequest
0 голосов
/ 05 ноября 2019

Я предварительно обучил последовательную модель, используя функциональный API-интерфейс Keras.

Теперь мне нужно загрузить модель, снять верхнюю часть и объединить ее с боковой моделью разветвления и обучить новую полную модель.

Я заинтересован в сохранении первых предварительно обученных слоев основной модели.

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

Число слоев в предварительно обученной модели является динамическим. Это мотивация для загрузки модели и ее изменения, а не использования конфигурации и весов для переконфигурирования предварительно обученных слоев в полной модели. Я не нашел рабочего способа жесткого кодирования конфигурации всей модели с помощью конфигурации и весов, который бы работал с изменением количества предварительно обученных слоев.

ОБНОВЛЕНИЕ: Чтобы было яснее, в чем проблема, мне нужнонастроить связанный граф. Сообщение об ошибке: «ValueError: График отключен: невозможно получить значение для тензорного тензора (« Pretrain_input: 0 », shape = (?, 4, 105), dtype = float32) на уровне« Pretrain_input »). Следующие предыдущие слои были доступны без проблем: [] '

##### MAIN MODEL #####

# loading pretrained model
main_model = load_model('models/main_model.h5')


# saving the output layer for reconstruction later
config_output_layer = main_model.layers[-1].get_config()
weights_output_layer = main_model.layers[-1].get_weights()


# removing the first and last layer (not sure if I need to remove the first layer, but I do this as I need an explicit 'entry point' for later concatenation with branching model later and re-compiling )
main_model.layers.pop(0)
main_model.layers.pop(-1)


# new first layer, for input later
main_input = Input(
    shape=(x_train_main.shape[1], x_train_main.shape[2]),
    name='Main_input')


# reconstructing last layer
main_output = Dense.from_config(config_last_layer)(main_model.output)


# re-defining the main model
new_main_model = Model(inputs=main_input, outputs=main_output)


 ##### BRANCHING MODEL #####   


branch_visible = Input(
    shape=(x_train_branch.shape[1], x_train_branch.shape[2]),
    name='Branch_input')


branch_hidden_0 = LSTM(
    units=units_lstm_layer,
    return_sequences=True,
    name='Branch_hidden_0'
)(branch_visible)


branch_dense = Dense(
    units=units_dense_layer,
    name='Branch_dense'
)(branch_hidden_0)


##### CONCAT THE MAIN AND THE BRANCH #####

concatenated_output = Concatenate(axis=-1)([main_output, branch_dense])


activation_layer = Dense(
    units=units_activation_layer,
    activation=activation,
    name='Activation'
)(concatenated_output)


final_model = Model(inputs=[main_visible, branch_visible], outputs=activation_layer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...