web-dev-qa-db-fra.com

Comment concaténer deux couches dans keras?

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

x1  x2  x3
 \  /   /
  y1   /
   \  /
    y2

Donc, j'avais créé un modèle avec deux calques et essayé de les fusionner, mais cela renvoyait 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'])
72
rdo

Vous obtenez l'erreur car result défini comme Sequential() est simplement un conteneur pour le modèle et vous n'avez pas défini d'entrée pour celui-ci.

Étant donné ce que vous essayez de construire, définissez 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 construire un modèle qui a ce type de structure d’entrée est d’utiliser api fonctionnel .

Voici une mise en œuvre de vos exigences 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 dans les commentaires:

1) Comment le résultat et la fusion sont-ils connectés? En supposant que vous vouliez dire comment ils sont concaténés.

La 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

les rangées sont juste jointes.

2) Maintenant, x1 est entré en premier, x2 est entré en deuxième et x3 en troisième.

91
orsonady

Vous pouvez expérimenter avec model.summary() (notez 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 voir le bloc-notes ici pour plus de détails: https://nbviewer.jupyter.org/github/anhhh11/DeepLearning/blob/master/Concanate_two_layer_keras.ipynb

5
o0omycomputero0o