¿Cómo “fusionar” los modelos secuenciales en Keras 2.0?

Estoy tratando de fusionar dos modelos secuenciales en Keras 2.0, usando la siguiente línea:

merged_model.add(Merge([model1, model2], mode='concat')) 

Esto todavía funciona bien, pero da una advertencia:

 "The `Merge` layer is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, eg `add`, `concatenate`, etc." 

Sin embargo, estudiar la documentación de Keras e intentar agregar, Add (), no ha resultado en algo que funcione. He leído varias publicaciones de personas con el mismo problema, pero a continuación no he encontrado ninguna solución que funcione en mi caso. ¿Alguna sugerencia?

 model = Sequential() model1 = Sequential() model1.add(Dense(300, input_dim=40, activation='relu', name='layer_1')) model2 = Sequential() model2.add(Dense(300, input_dim=40, activation='relu', name='layer_2')) merged_model = Sequential() merged_model.add(Merge([model1, model2], mode='concat')) merged_model.add(Dense(1, activation='softmax', name='output_layer')) merged_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) checkpoint = ModelCheckpoint('weights.h5', monitor='val_acc', save_best_only=True, verbose=2) early_stopping = EarlyStopping(monitor="val_loss", patience=5) merged_model.fit([x1, x2], y=y, batch_size=384, epochs=200, verbose=1, validation_split=0.1, shuffle=True, callbacks=[early_stopping, checkpoint]) 

EDITAR: Cuando lo intenté (como se sugiere a continuación por Kent Sommer):

 from keras.layers.merge import concatenate merged_model.add(concatenate([model1, model2])) 

Este fue el mensaje de error:

 Traceback (most recent call last): File "/anaconda/lib/python3.6/site- packages/keras/engine/topology.py", line 425, in assert_input_compatibility K.is_keras_tensor(x) File "/anaconda/lib/python3.6/site- packages/keras/backend/tensorflow_backend.py", line 403, in is_keras_tensor raise ValueError('Unexpectedly found an instance of type `' + str(type(x)) + '`. ' ValueError: Unexpectedly found an instance of type ``. Expected a symbolic tensor instance. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "quoradeeptest_simple1.py", line 78, in  merged_model.add(concatenate([model1, model2])) File "/anaconda/lib/python3.6/site-packages/keras/layers/merge.py", line 600, in concatenate return Concatenate(axis=axis, **kwargs)(inputs) File "/anaconda/lib/python3.6/site- packages/keras/engine/topology.py", line 558, in __call__self.assert_input_compatibility(inputs) File "/anaconda/lib/python3.6/site-packages/keras/engine/topology.py", line 431, in assert_input_compatibility str(inputs) + '.All inputs to the layer ' ValueError: Layer concatenate_1 was called with an input that isn't a symbolic tensor. Received type: . Full input: [, ]. All inputs to the layer should be tensors. 

Lo que dice esta advertencia es que, en lugar de usar la capa de fusión con un modo específico, los diferentes modos ahora se han dividido en sus propias capas individuales.

Así que Merge(mode='concat') ahora está concatenate(axis=-1) .

Sin embargo, como desea combinar modelos y no capas, esto no funcionará en su caso. Lo que deberá hacer es usar el modelo funcional, ya que este comportamiento ya no es compatible con el tipo de modelo secuencial básico.

En su caso, eso significa que el código debe cambiarse a lo siguiente:

 from keras.layers.merge import concatenate from keras.models import Model, Sequential from keras.layers import Dense, Input model1_in = Input(shape=(27, 27, 1)) model1_out = Dense(300, input_dim=40, activation='relu', name='layer_1')(model1_in) model1 = Model(model1_in, model1_out) model2_in = Input(shape=(27, 27, 1)) model2_out = Dense(300, input_dim=40, activation='relu', name='layer_2')(model2_in) model2 = Model(model2_in, model2_out) concatenated = concatenate([model1_out, model2_out]) out = Dense(1, activation='softmax', name='output_layer')(concatenated) merged_model = Model([model1_in, model2_in], out) merged_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) checkpoint = ModelCheckpoint('weights.h5', monitor='val_acc', save_best_only=True, verbose=2) early_stopping = EarlyStopping(monitor="val_loss", patience=5) merged_model.fit([x1, x2], y=y, batch_size=384, epochs=200, verbose=1, validation_split=0.1, shuffle=True, callbacks=[early_stopping, checkpoint]) 

A menos que tenga una buena razón para mantener los modelos separados, puede (y debe) tener la misma topología en un solo modelo. Algo como:

 input1 = Input(shape=(27, 27, 1)) dense1 = Dense(300, activation='relu', name='layer_1')(input1) input2 = Input(shape=(27, 27, 1)) dense2 = Dense(300, activation='relu', name='layer_2')(input2) merged = concatenate([dense1, dense2]) out = Dense(1, activation='softmax', name='output_layer')(merged) model = Model(inputs = [input1, input2], outputs = [out])