İki katmanlı bir sinir ağı örneğim var. İlk katman iki argüman alır ve bir çıktısı vardır. İkincisi, ilk katmanın sonucu olarak bir argüman ve bir ek argüman almalıdır. Şöyle görünmeli:
x1 x2 x3
\ / /
y1 /
\ /
y2
Bu yüzden, iki katmanlı bir model oluşturdum ve bunları birleştirmeye çalıştım ancak bir hata döndürüyor: Sıralı modeldeki ilk katman bir "input_shape" veya "batch_input_shape" argümanı almalıdır.
result.add(merged)
satırında.
Model:
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'])
Hatayı alıyorsunuz çünkü Sequential()
olarak tanımlanan result
sadece model için bir konteynerdir ve bunun için bir girdi tanımlamadınız.
Oluşturmaya çalıştığınız şey göz önüne alındığında, result
öğesini üçüncü girdi olan x3
öğesini alacak şekilde ayarlayın.
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'])
Ancak, bu tür bir girdi yapısına sahip bir model oluşturmak için tercih ettiğim yol functional api kullanmak olacaktır.
İşte başlamanız için gereksinimlerinizin bir uygulaması:
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'])
Yorumlardaki soruyu yanıtlamak için:
Birleştirme şu şekilde çalışır:
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
yani satırlar sadece birleştirilir.
x1
birinciye, x2
ikinciye ve x3
üçüncüye girilir.model.summary()` ile deneyebilirsiniz (concatenate_XX (Birleştir) katman boyutuna dikkat edin)
# 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()
Detaylı bilgi için not defterini buradan inceleyebilirsiniz: https://nbviewer.jupyter.org/github/anhhh11/DeepLearning/blob/master/Concanate_two_layer_keras.ipynb
Yukarıda kabul edilen cevaba ekleme yaparak tensorflow 2.0
kullananlara yardımcı olmak
import tensorflow as tf
# bazı veriler
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, x2, x3 katmanlarını pişir
x1 = tf.keras.layers.Dense(10)(c1)
x2 = tf.keras.layers.Dense(10)(c2)
x3 = tf.keras.layers.Dense(10)(c3)
# birleştirilmiş katman y1
y1 = tf.keras.layers.Concatenate(axis=1)([x1, x2])
# birleştirilmiş katman y2
y2 = tf.keras.layers.Concatenate(axis=1)([y1, x3])
# bilgi yazdır
print("-"*30)
print("x1", x1.shape, "x2", x2.shape, "x3", x3.shape)
print("y1", y1.shape)
print("y2", y2.shape)
print("-"*30)
Sonuç:
------------------------------
x1 (2, 10) x2 (2, 10) x3 (2, 10)
y1 (2, 20)
y2 (2, 30)
------------------------------