Comment concaténer deux couches de kéras?

j'ai un exemple de réseau neuronal à 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'ai créé un modèle avec deux couches et j'ai essayé de les fusionner mais il retourne 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'])
44
demandé sur hnefatl 2017-04-04 03:56:54

2 réponses

Eh bien, vous obtenez l'erreur parce que le résultat défini comme Sequential() est juste un conteneur pour la un modèle et que vous n'avez pas défini une entrée.

compte tenu de ce que vous essayez de construire le set result pour prendre la troisième sortie 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 façon préférée de construire le modèle qui a ce type de structure d'entrée serait d'utiliser le fonctionnelle de l'api.

Voici une implémentation de vos exigences pour vous commencé:

from keras.models import Sequential, 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)
model.compile(optimizer=ada_grad, loss='binary_crossentropy',
               metrics=['accuracy'])

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

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

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

I. les rangées sont juste jointes.

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

58
répondu orsonady 2018-03-18 11:39:15

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 carnet ici pour plus de détails: https://nbviewer.jupyter.org/github/anhhh11/DeepLearning/blob/master/Concanate_two_layer_keras.ipynb

0
répondu o0omycomputero0o 2018-01-18 13:13:54