keras模型合并,输入输出问题

merge of keras model, input output problem

我想使用一个已经训练好的模型分两步构建一个新模型。

根据图中,将已经训练好的模型视为 model_109,第一层 LSTM (Extracteur_LSTM),第二层密集输出,最后一层密集输出。

我的目标是提供 model_109 并获得输出 (output1)。 和 作为第二个模型,仅使用 model_109 (Extracteur_LSTM) 输出的头部,将其合并到 output1 以提供新的密集模型。 我的最终输出是 model_109 和新密集模型的输出。

tensor_input = Input(shape=(Xn.shape[1], Xn.shape[2]), name='input2')

prev_model = load_model('model_109.h5')

out_prev_mod = prev_model(tensor_input)
merge_1 = Concatenate()([prev_model.layers[1].output, out_prev_mod])

xy2 = Dense(60+1, activation='softsign',
                kernel_initializer= initializers.he_uniform(), 
                name='DenseOutput2')(merge_1)
xy2 = Dropout(rate = 02])(xy2)
    
out2 = Dense(1, activation='linear',
                kernel_initializer= initializers.he_uniform(), 
                name='Output2')(xy2)


output = Concatenate()([out_prev_mod, out2])
    
model = Model(inputs=[prev_model.input, tensor_input], outputs=[output])


optimizer = optimizers.Adam(lr=params['learningRate']) # optimizer = RMSprop, 
            'Adagrad', 'adam' 'adadelta'
            early_stopping = EarlyStopping(monitor='val_loss', patience=autres_param['patience'] )
    if chckpts == True:
        filepath = 'models/' + nom_exp + "_best-weights.h5"
        checkpoint = ModelCheckpoint(filepath= filepath, monitor='val_loss', 
                     mode='min', save_best_only=True)
        cllBck = [early_stopping, checkpoint]
    else:
        cllBck = [early_stopping]
    model.compile(optimizer=optimizer, loss=params['loss'])

    
    history = model.fit([Xn], yn, validation_split = 
              autres_param['valid_ratio'],
              epochs=autres_param['epochs'], shuffle = autres_param['shuffle'],
              batch_size = autres_param['batch'], verbose=2, callbacks=cllBck)

图中,input1和input相同,Extracteur_LSTM是Model_109第一层的副本

最后我得到这个错误...

ValueError:检查模型输入时出错:您传递给模型的 Numpy 数组列表不是模型预期的大小。预计会看到 2 个数组,但却得到了以下 1 个数组的列表:[array([[[[8.19255325e-04,

终于搞定了....

tensor_input = Input(shape=(Xn.shape[1], Xn.shape[2]), name='input') 

prev_model = load_model('model_109.h5')

# keep head of model
model2= Model(inputs=prev_model .input, outputs=prev_model.layers[-2].output) 

new_mod = Sequential()
new_mod.add(prev_model )

# Freeze trained Layer 0 
new_mod.layers[0].trainable = False

## add/replace layer
new_mod.add(Dense(params['unitsDense1'], activation=params['activationDenseOutput'],
                  kernel_initializer= initializers.he_uniform(),
                  name='DenseOutput1'))

new_mod.add(Dense(1, activation=params['activationDenseOutput'],
                  kernel_initializer= initializers.he_uniform(),
                  name='DenseOutput1'))