Я предварительно обучил последовательную модель, используя функциональный 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)