Làm thế nào để nối hai lớp trong keras?


93

Tôi có một ví dụ về mạng nơ-ron có hai lớp. Lớp đầu tiên nhận hai đối số và có một đầu ra. Thứ hai sẽ nhận một đối số là kết quả của lớp đầu tiên và một đối số bổ sung. Nó sẽ trông như thế này:

x1  x2  x3
 \  /   /
  y1   /
   \  /
    y2

Vì vậy, tôi đã tạo một mô hình có hai lớp và cố gắng hợp nhất chúng nhưng nó trả về lỗi: The first layer in a Sequential model must get an "input_shape" or "batch_input_shape" argument. trên dòng result.add(merged).

Mô hình:

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

Câu trả lời:


120

Bạn đang gặp lỗi vì resultđược định nghĩa làSequential() là chỉ một vùng chứa cho mô hình và bạn chưa xác định đầu vào cho nó.

Đưa ra những gì bạn đang cố gắng xây dựng resultđể lấy đầu vào thứ ba 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'])

Tuy nhiên, cách ưa thích của tôi để xây dựng một mô hình có kiểu cấu trúc đầu vào này là sử dụng api chức năng .

Dưới đây là cách triển khai các yêu cầu của bạn để giúp bạn bắt đầu:

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

Để trả lời câu hỏi trong phần bình luận:

1) Kết quả và kết hợp được kết nối như thế nào? Giả sử ý bạn là chúng được nối với nhau như thế nào.

Kết nối hoạt động như thế này:

  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

tức là các hàng vừa được nối.

2) Bây giờ, x1được nhập vào đầu tiên, x2được nhập vào thứ hai và x3nhập vào thứ ba.


Các lớp resultmerged(hoặc merged2) được kết nối với nhau như thế nào trong phần đầu tiên của câu trả lời của bạn?
rdo

và câu hỏi thứ hai. Theo tôi hiểu x1x2là đầu vào cho first_input, x3cho third_input. Về cái gì second_input?
rdo

1
second_inputđược chuyển qua một Denselớp và được nối với lớp first_inputcũng đã được chuyển qua một Denselớp. third_inputđược chuyển qua một lớp dày đặc và được nối với kết quả của phép nối trước đó ( merged)
parsethis

2
@putonspectacles Cách thứ hai sử dụng API chức năng hoạt động, tuy nhiên, cách thứ nhất sử dụng mô hình Tuần tự không hoạt động đối với tôi trong Keras 2.0.2. Tôi đã kiểm tra sơ bộ việc triển khai và việc gọi "Concatenate ([...])" không làm được gì nhiều và hơn nữa, bạn không thể thêm nó vào một mô hình tuần tự. Tôi thực sự nghĩ rằng người ta vẫn cần sử dụng phương pháp mô tả "Merge ([...], 'concat')" cho đến khi họ cập nhật Keras. Bạn nghĩ sao?
LFish

2
Sự khác biệt giữa Concatenate()concatenate()các lớp trong Keras là gì?
Leevo

8

Thêm vào câu trả lời được chấp nhận ở trên để nó giúp những người đang sử dụng 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)

Kết quả:

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

7

Bạn có thể thử nghiệm với model.summary()(lưu ý kích thước lớp 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()

Bạn có thể xem sổ tay tại đây để biết thêm chi tiết: https://nbviewer.jupyter.org/github/anhhh11/DeepLearning/blob/master/Concanate_two_layer_keras.ipynb


3
Sự khác biệt giữa Concatenate()concatenate()các lớp trong Keras là gì?
Leevo

1
Bạn có tìm ra sự khác biệt không, một là lớp Keras và một là phương thức
tensorflow
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.