120 votes

Comment concaténer deux couches dans keras?

J'ai un exemple d'un réseau de neurones à deux couches. La première couche prend deux arguments et a une sortie. Le second devrait prendre un argument comme résultat de la première couche et un argument supplémentaire. Il devrait ressembler à ceci:

x1  x2  x3
 \  /   /
  y1   /
   \  /
    y2

Donc, j'avais créé un modèle avec deux couches et a essayé de les fusionner, mais il renvoie une erreur: The first layer in a Sequential model must get an "input_shape" or "batch_input_shape" argument. sur la ligne result.add(merged).

Modèle:

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'])

145voto

orsonady Points 4926

Vous obtenez le message d'erreur, car result défini comme Sequential() est juste un conteneur pour le modèle et vous n'avez pas défini une entrée.

Compte tenu de ce que vous essayez de construire ensemble result pour prendre la troisième entrée 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'])

Cependant, ma manière préférée de construction d'un modèle qui dispose de ce type de structure d'entrée serait l'utilisation de la fonctionnelle de l'api.

Voici une mise en œuvre de vos besoins pour vous aider à démarrer:

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'])

Pour répondre à la question suivante dans les commentaires:

1) Comment sont le résultat et fusionné connecté? En supposant que vous dire comment ils sont concaténées.

Concaténation fonctionne comme ceci:

  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

j'.e les lignes sont juste de rejoindre.

2) Maintenant, x1 est entrée pour la première, x2 est entrée en deuxième et x3 d'entrée en troisième.

8voto

Vous pouvez expérimenter avec model.summary() (remarquez la taille de la couche 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()
 

Vous pouvez consulter le bloc-notes ici pour plus de détails: https://nbviewer.jupyter.org/github/anhhh11/DeepLearning/blob/master/Concanate_two_layer_keras.ipynb

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X