Comment concaténer deux couches dans des keras?

93

J'ai un exemple de réseau neuronal à deux couches. La première couche prend deux arguments et a une sortie. Le second 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 couches et essayé de les fusionner mais cela 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'])
rdo
la source

Réponses:

120

Vous obtenez l'erreur car resultdéfini comme Sequential()étant 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 resultpour 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 créer un modèle qui a ce type de structure d'entrée serait d'utiliser l' API fonctionnelle .

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 sont-ils 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

c'est-à-dire que les lignes sont simplement jointes.

2) Maintenant, x1est entré dans le premier, x2est entré dans le deuxième et x3entré dans le troisième.

parsethis
la source
Comment resultet merged(ou merged2) les couches sont-elles liées les unes aux autres dans la première partie de votre réponse?
rdo
et la deuxième question. Si je comprends bien x1et x2est une entrée pour first_input, x3pour third_input. De quoi s'agit-il second_input?
rdo
1
second_inputest passé à travers une Densecouche et est concaténé avec first_inputlequel a également été passé à travers une Densecouche. third_inputest passé à travers une couche dense et la concaténation avec le résultat de la concaténation précédente ( merged)
parsethis
2
@putonspectacles La deuxième façon d'utiliser l'API fonctionnelle fonctionne, cependant, la première façon d'utiliser un modèle séquentiel ne fonctionne pas pour moi dans Keras 2.0.2. J'ai grossièrement vérifié l'implémentation et appeler "Concatenate ([...])" ne fait pas grand chose et de plus, vous ne pouvez pas l'ajouter à un modèle séquentiel. Je pense en fait qu'il faut encore utiliser la méthode dépréciée "Merge ([...], 'concat')" jusqu'à ce qu'ils mettent à jour Keras. Qu'est-ce que tu penses?
LFish
2
Quelle est la différence entre Concatenate()et les concatenate()couches dans Keras?
Leevo le
8

Ajout à la réponse acceptée ci-dessus afin qu'elle aide ceux qui utilisent tensorflow 2.0


import tensorflow as tf

# some data
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)

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

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

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

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

Résultat:

------------------------------
x1 (2, 10) x2 (2, 10) x3 (2, 10)
y1 (2, 20)
y2 (2, 30)
------------------------------
Praveen Kulkarni
la source
7

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

o0omycomputero0o
la source
3
Quelle est la différence entre Concatenate()et les concatenate()couches dans Keras?
Leevo le
1
Avez-vous compris la différence, l'une est une classe Keras et une autre est une méthode
tensorflow