Bagaimana menggabungkan dua lapisan dengan keras?


96

Saya memiliki contoh jaringan saraf dengan dua lapisan. Lapisan pertama mengambil dua argumen dan memiliki satu keluaran. Yang kedua harus mengambil satu argumen sebagai hasil dari lapisan pertama dan satu argumen tambahan. Ini akan terlihat seperti ini:

x1  x2  x3
 \  /   /
  y1   /
   \  /
    y2

Jadi, saya telah membuat model dengan dua lapisan dan mencoba menggabungkannya tetapi mengembalikan kesalahan: The first layer in a Sequential model must get an "input_shape" or "batch_input_shape" argument.di telepon 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'])

Jawaban:


123

Anda mendapatkan kesalahan karena resultdidefinisikan sebagai Sequential()hanya wadah untuk model dan Anda belum menentukan masukan untuk itu.

Mengingat apa yang Anda coba buat, set resultuntuk mengambil input ketiga 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'])

Namun, cara yang saya sukai untuk membangun model yang memiliki jenis struktur input ini adalah dengan menggunakan api fungsional .

Berikut adalah implementasi dari persyaratan Anda untuk Anda mulai:

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

Untuk menjawab pertanyaan di komentar:

  1. Bagaimana hasil dan penggabungan terhubung? Dengan asumsi yang Anda maksud bagaimana mereka digabungkan.

Penggabungan berfungsi seperti ini:

  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

yaitu baris baru saja bergabung.

  1. Sekarang, x1masukan ke pertama, x2masukan ke kedua dan x3masukan ke ketiga.

Bagaimana lapisan resultdan merged(atau merged2) terhubung satu sama lain di bagian pertama jawaban Anda?
rdo

dan pertanyaan kedua. Seperti yang saya pahami x1dan x2merupakan masukan untuk first_input, x3untuk third_input. Tentang apa second_input?
rdo

1
second_inputdilewatkan melalui sebuah Denselapisan dan digabungkan dengan first_inputyang juga dilewatkan melalui sebuah Denselapisan. third_inputdilewatkan melalui lapisan padat dan digabung dengan hasil penggabungan sebelumnya ( merged)
parsethis

2
@putonspectacles Cara kedua menggunakan fungsional API berfungsi, namun, cara pertama menggunakan Sequential-model tidak berfungsi untuk saya di Keras 2.0.2. Saya telah memeriksa secara kasar implementasinya dan memanggil "Concatenate ([...])" tidak melakukan banyak hal dan selanjutnya, Anda tidak dapat menambahkannya ke model sekuensial. Saya sebenarnya berpikir seseorang masih perlu menggunakan metode depricated "Merge ([...], 'concat')" sampai mereka memperbarui Keras. Bagaimana menurut anda?
LFish

2
Apa perbedaan antara Concatenate()dan concatenate()lapisan di Keras?
Leevo

9

Menambah jawaban yang diterima di atas sehingga membantu mereka yang menggunakan 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)

Hasil:

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

7

Anda dapat bereksperimen dengan model.summary()(perhatikan ukuran layer 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()

Anda dapat melihat notebook di sini untuk detailnya: https://nbviewer.jupyter.org/github/anhhh11/DeepLearning/blob/master/Concanate_two_layer_keras.ipynb


3
Apa perbedaan antara Concatenate()dan concatenate()lapisan di Keras?
Leevo

1
Apakah Anda mengetahui perbedaannya, satu adalah kelas Keras dan yang lainnya adalah metode
tensorflow
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.