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'])
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:
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.
x1
se introduce en la primera, x2
se introduce en la segunda y x3
se introduce en la tercera.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
Añadiendo a la respuesta anterior para que ayude a los que usan tensorflow 2.0
.
``python
importar tensorflow como tf
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)
x1 = tf.keras.layers.Dense(10)(c1) x2 = tf.keras.layers.Dense(10)(c2) x3 = tf.keras.layers.Dense(10)(c3)
y1 = tf.keras.layers.Concatenate(axis=1)([x1, x2])
y2 = tf.keras.layers.Concatenate(axis=1)([y1, x3])
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)
------------------------------