¿Cómo concatenar dos capas en keras?

Tengo un ejemplo de una red neuronal con dos capas. La primera capa toma dos argumentos y tiene una salida. La segunda debe tomar un argumento como resultado de la primera capa y un argumento adicional. Debería tener el siguiente aspecto:

x1  x2  x3
 \  /   /
  y1   /
   \  /
    y2

Así que, yo había creado un modelo con dos capas y trató de combinarlos, pero devuelve un error: La primera capa en un modelo secuencial debe obtener un "input_shape" o "batch_input_shape" argumento. en la línea result.add(merged).

Modelo:

first = Sequential()
first.add(Dense(1, input_shape=(2,), activation='sigmoid'))

second = Sequential()
second.add(Dense(1, input_shape=(1,), activation='sigmoid'))

result = Sequential()
merged = Concatenate([first, second])
ada_grad = Adagrad(lr=0.1, epsilon=1e-08, decay=0.0)
result.add(merged)
result.compile(optimizer=ada_grad, loss=_loss_tensor, metrics=['accuracy'])
Solución

El error se debe a que resultado definido como Secuencial() es sólo un contenedor para el modelo y no se ha definido una entrada para él.

lenguaje-todo: lang-python -->

Teniendo en cuenta lo que estás tratando de construir establece resultado para tomar la tercera entrada x3.

first = Sequential()
first.add(Dense(1, input_shape=(2,), activation='sigmoid'))

second = Sequential()
second.add(Dense(1, input_shape=(1,), activation='sigmoid'))

third = Sequential()
# of course you must provide the input to result with will be your x3
third.add(Dense(1, input_shape=(1,), activation='sigmoid'))

# lets say you add a few more layers to first and second.
# concatenate them
merged = Concatenate([first, second])

# then concatenate the two outputs

result = Concatenate([merged,  third])

ada_grad = Adagrad(lr=0.1, epsilon=1e-08, decay=0.0)

result.compile(optimizer=ada_grad, loss='binary_crossentropy',
               metrics=['accuracy'])

Sin embargo, mi forma preferida de construir un modelo que tenga este tipo de estructura de entrada sería utilizar la api funcional.

Aquí hay una implementación de sus requisitos para empezar:

from keras.models import Model
from keras.layers import Concatenate, Dense, LSTM, Input, concatenate
from keras.optimizers import Adagrad

first_input = Input(shape=(2, ))
first_dense = Dense(1, )(first_input)

second_input = Input(shape=(2, ))
second_dense = Dense(1, )(second_input)

merge_one = concatenate([first_dense, second_dense])

third_input = Input(shape=(1, ))
merge_two = concatenate([merge_one, third_input])

model = Model(inputs=[first_input, second_input, third_input], outputs=merge_two)
ada_grad = Adagrad(lr=0.1, epsilon=1e-08, decay=0.0)
model.compile(optimizer=ada_grad, loss='binary_crossentropy',
               metrics=['accuracy'])

Para responder a la pregunta en los comentarios:

  1. ¿Cómo se conectan el resultado y la fusión? Suponiendo que te refieres a cómo se concatenan.

La concatenación funciona así:

  a        b         c
a b c   g h i    a b c g h i
d e f   j k l    d e f j k l

es decir, las filas se acaban de unir.

  1. Ahora, x1 se introduce en la primera, x2 se introduce en la segunda y x3 se introduce en la tercera.
Comentarios (11)

Puedes experimentar con model.summary() (fíjate en el tamaño de la capa concatenate_XX (Concatenate))

# merge samples, two input must be same shape
inp1 = Input(shape=(10,32))
inp2 = Input(shape=(10,32))
cc1 = concatenate([inp1, inp2],axis=0) # Merge data must same row column
output = Dense(30, activation='relu')(cc1)
model = Model(inputs=[inp1, inp2], outputs=output)
model.summary()

# merge row must same column size
inp1 = Input(shape=(20,10))
inp2 = Input(shape=(32,10))
cc1 = concatenate([inp1, inp2],axis=1)
output = Dense(30, activation='relu')(cc1)
model = Model(inputs=[inp1, inp2], outputs=output)
model.summary()

# merge column must same row size
inp1 = Input(shape=(10,20))
inp2 = Input(shape=(10,32))
cc1 = concatenate([inp1, inp2],axis=1)
output = Dense(30, activation='relu')(cc1)
model = Model(inputs=[inp1, inp2], outputs=output)
model.summary()

Usted puede ver el cuaderno aquí para el detalle: https://nbviewer.jupyter.org/github/anhhh11/DeepLearning/blob/master/Concanate_two_layer_keras.ipynb

Comentarios (1)

Añadiendo a la respuesta anterior para que ayude a los que usan tensorflow 2.0.

``python

importar tensorflow como tf

algunos datos

c1 = tf.constant([[1, 1, 1], [2, 2, 2]], dtype=tf.float32) c2 = tf.constant([[2, 2, 2], [3, 3, 3]], dtype=tf.float32) c3 = tf.constant([[3, 3, 3], [4, 4, 4]], dtype=tf.float32)

hornear capas x1, x2, x3

x1 = tf.keras.layers.Dense(10)(c1) x2 = tf.keras.layers.Dense(10)(c2) x3 = tf.keras.layers.Dense(10)(c3)

capa fusionada y1

y1 = tf.keras.layers.Concatenate(axis=1)([x1, x2])

capa combinada y2

y2 = tf.keras.layers.Concatenate(axis=1)([y1, x3])

imprimir información

print("-"30) print("x1", x1.shape, "x2", x2.shape, "x3", x3.shape) print("y1", y1.shape) print("y2", y2.shape) print("-"30)


Resultado:

``texto
------------------------------
x1 (2, 10) x2 (2, 10) x3 (2, 10)
y1 (2, 20)
y2 (2, 30)
------------------------------
Comentarios (0)