Sáp nhập hai mô hình khác nhau trong Keras


25

Tôi đang cố gắng hợp nhất hai mô hình Keras thành một mô hình duy nhất và tôi không thể thực hiện được điều này.

Ví dụ, trong Hình đính kèm, tôi muốn tìm nạp lớp giữa của chiều 8 và sử dụng lớp này làm đầu vào cho lớp (của chiều thứ 8 một lần nữa) trong Mô hình và sau đó kết hợp cả Mô hình và Mô hình làm một mô hình.A2B1BAB

Tôi đang sử dụng mô-đun chức năng để tạo Model và Model một cách độc lập. Làm thế nào tôi có thể hoàn thành nhiệm vụ này?AB

Lưu ý : là lớp đầu vào cho mô hình và là lớp đầu vào cho mô hình .A1AB1B

Xem hình

Câu trả lời:


22

Tôi đã tìm ra câu trả lời cho câu hỏi của tôi và đây là đoạn mã được xây dựng dựa trên câu trả lời trên.

from keras.layers import Input, Dense
from keras.models import Model
from keras.utils import plot_model

A1 = Input(shape=(30,),name='A1')
A2 = Dense(8, activation='relu',name='A2')(A1)
A3 = Dense(30, activation='relu',name='A3')(A2)

B2 = Dense(40, activation='relu',name='B2')(A2)
B3 = Dense(30, activation='relu',name='B3')(B2)

merged = Model(inputs=[A1],outputs=[A3,B3])
plot_model(merged,to_file='demo.png',show_shapes=True)

và đây là cấu trúc đầu ra mà tôi muốn:

nhập mô tả hình ảnh ở đây


Lưu ý rằng bạn không hợp nhất hai mô hình (theo nghĩa của Mô hình máy ảnh) ở trên, bạn đang hợp nhất các lớp.
gents

7

Trong Keras có một cách hữu ích để xác định mô hình: sử dụng API chức năng . Với API chức năng, bạn có thể xác định một đồ thị theo chu kỳ theo hướng, cho phép bạn xây dựng các kiến ​​trúc hoàn toàn tùy ý. Xem xét ví dụ của bạn:

#A_data = np.zeros((1,30))
#A_labels = np.zeros((1,30))
#B_labels =np.zeros((1,30))

A1 = layers.Input(shape=(30,), name='A_input')
A2 = layers.Dense(8, activation='???')(A1)
A3 = layers.Dense(30, activation='???', name='A_output')(A2)


B2 = layers.Dense(40, activation='???')(A2)
B3 = layers.Dense(30, activation='???', name='B_output')(B2)

## define A
A = models.Model(inputs=A1, outputs=A3)

## define B
B = models.Model(inputs=A1, outputs=B3) 

B.compile(optimizer='??',
          loss={'B_output': '??'}
          )

B.fit({'A_input': A_data},
  {'B_output': B_labels},
  epochs=??, batch_size=??)

À chính nó đấy! Bạn có thể xem kết quả bằng cách B.summary()::

Layer (type)                 Output Shape              Param    
A_input (InputLayer)         (None, 30)                0         
_________________________________________________________________
dense_8 (Dense)              (None, 8)                 248     
______________________________________________________________
dense_9 (Dense)              (None, 40)                360       
_________________________________________________________________
B_output (Dense)             (None, 30)                1230      

Cảm ơn câu trả lời, nhưng tôi không nghĩ đoạn mã trên sẽ hoạt động. Thứ nhất, khi bạn nói B = models.Model (đầu vào = A2, đầu ra = B3) nó sẽ cung cấp cho bạn một TypeError lỗi: lớp Input đến Modelphải InputLayerđối tượng. Đầu vào nhận được: Tenor. Ngoài ra, như đã đề cập trước đó, tôi đã sử dụng API chức năng để tạo riêng Mô hình A và Mô hình B. Tôi nghĩ rằng câu trả lời mà tôi đang tìm kiếm có thể phải thực hiện với phần "Các mô hình đa đầu vào và đa đầu ra" trong tài liệu về máy ảnh sử dụng chức năng nối (mặc dù không hoàn toàn chắc chắn).
Rkz

@Rkz: Tôi đã chỉnh sửa câu trả lời. Nó hoạt dộng bây giờ. Chúng ta phải sử dụng "concatenate". Trên thực tế, bạn nên đề cập đến đầu vào chính (A1) khi bạn muốn xác định mô hình "B".
moh 29/12/17

Cảm ơn thời gian và chỉnh sửa của bạn. Tôi đã tìm ra câu trả lời từ tài liệu của Keras (xem câu trả lời sau). Tôi không yêu cầu concatenate cho câu hỏi của tôi.
Rkz

@Rkz: Nhìn vào bản chỉnh sửa cuối cùng, tôi cũng chỉ ra cách biên dịch và phù hợp với mô hình.
moh 29/12/17
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.