Keras'ta iki katman nasıl birleştirilir?


96

İki katmanlı bir sinir ağı örneğim var. İlk katman iki argüman alır ve bir çıktıya sahiptir. İkincisi, birinci 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 onları birleştirmeye çalıştım ama bir hata döndürüyor: The first layer in a Sequential model must get an "input_shape" or "batch_input_shape" argument.satırda result.add(merged).

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

Yanıtlar:


123

Hatayı alıyorsunuz çünkü resulttanımlandığı Sequential()için model için sadece bir kaptır ve onun için bir girdi tanımlamadınız.

resultÜçüncü girişi almak için küme oluşturmaya çalıştığınız şey göz önüne alındığında 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 which 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şturmanın tercih ettiğim yolu, işlevsel api'yi kullanmak olacaktır .

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 cevaplamak için:

  1. Sonuç ve birleştirme nasıl bağlanır? Nasıl bir araya getirildiklerini kastettiğinizi varsayarsak.

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 yeni birleştirilir.

  1. Şimdi, x1birinciye x2girdi, ikinciye x3girdi ve üçüncüye girdi.

Cevabınızın ilk kısmında resultve merged(veya merged2) katmanlar birbirleriyle nasıl bağlantılı?
rdo

ve ikinci soru. Anlıyorum gibi x1ve x2bir girdidir first_input, x3için third_input. Ne hakkında second_input?
rdo

1
second_inputbir Densekatmandan geçirilir ve bir katmandan first_inputda geçirilerek birleştirilir Dense. third_inputyoğun bir katmandan geçirilir ve önceki birleştirmenin ( merged)
sonucuyla

2
@putonspectacles İşlevsel API'yi kullanmanın ikinci yolu işe yarıyor, ancak Sıralı modeli kullanmanın ilk yolu, Keras 2.0.2'de benim için çalışmıyor. Uygulamayı kabaca kontrol ettim ve "Concatenate ([...])" demek pek bir işe yaramıyor ve dahası, onu sıralı bir modele ekleyemezsiniz. Aslında, Keras'ı güncelleyene kadar, "Merge ([...], 'concat')" sınırlandırılmış yöntemini kullanması gerektiğini düşünüyorum. Ne düşünüyorsun?
LFish

2
Arasındaki fark nedir Concatenate()ve concatenate()keras katmanlar?
Leevo

9

Yukarıda kabul edilen cevaba ekleyerek, kullananlara yardımcı olması için 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)

Sonuç:

------------------------------
x1 (2, 10) x2 (2, 10) x3 (2, 10)
y1 (2, 20)
y2 (2, 30)
------------------------------

7

Deney yapabilirsiniz model.summary()(concatenate_XX (Concatenate) 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()

Detay için not defterini buradan inceleyebilirsiniz: https://nbviewer.jupyter.org/github/anhhh11/DeepLearning/blob/master/Concanate_two_layer_keras.ipynb


3
Arasındaki fark nedir Concatenate()ve concatenate()keras katmanlar?
Leevo

1
Farkı anladınız mı, biri Keras sınıfı, diğeri tensorflow yöntemi
abacusreader
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.