Menggabungkan dua model berbeda dalam Keras


26

Saya mencoba menggabungkan dua model Keras menjadi satu model dan saya tidak dapat melakukannya.

Sebagai contoh pada Gambar terlampir, saya ingin mengambil lapisan tengah dari dimensi 8, dan menggunakan ini sebagai input ke lapisan (dari dimensi 8 lagi) di Model dan kemudian menggabungkan kedua Model dan Model sebagai model tunggal.SEBUAH2B1BSEBUAHB

Saya menggunakan modul fungsional untuk membuat Model dan Model secara mandiri. Bagaimana saya bisa menyelesaikan tugas ini?SEBUAHB

Catatan : adalah masukan lapisan model dan adalah masukan lapisan model .SEBUAH1SEBUAHB1B

Lihat gambar

Jawaban:


22

Saya menemukan jawaban untuk pertanyaan saya dan di sini adalah kode yang dibangun di atas jawaban di atas.

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)

dan di sini adalah struktur output yang saya inginkan:

masukkan deskripsi gambar di sini


Perhatikan bahwa Anda tidak menggabungkan dua model (dalam arti Model keras) di atas, Anda menggabungkan lapisan.
gented

7

Di Keras ada cara yang bermanfaat untuk mendefinisikan model: menggunakan API fungsional . Dengan API fungsional, Anda dapat menentukan grafik lapisan asiklik yang diarahkan, yang memungkinkan Anda membangun arsitektur yang sepenuhnya arbitrer. Mempertimbangkan contoh Anda:

#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=??)

Jadi begitulah! Anda dapat melihat hasilnya dengan 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      

Terima kasih atas jawabannya, tapi saya rasa kode di atas tidak akan berfungsi. Pertama, ketika Anda mengatakan B = models.Model (input = A2, output = B3) itu akan memberi Anda kesalahan TypeError: Lapisan input ke a Modelharus InputLayerobjek. Input yang diterima: Tensor. Juga, seperti yang disebutkan sebelumnya, saya memang menggunakan API fungsional untuk membuat Model A dan Model B secara terpisah. Saya pikir jawaban yang saya cari mungkin ada hubungannya dengan bagian "Multi-input dan multi-output model" dalam dokumentasi keras yang menggunakan fungsi concatenate (tidak seluruh yakin sekalipun).
Rkz

@Rkz: Saya telah mengedit jawabannya. Ini berfungsi sekarang. Kita harus menggunakan "concatenate". Sebenarnya, Anda harus menyebutkan input utama (A1) ketika Anda ingin mendefinisikan model "B".
moh

Terima kasih atas waktu dan suntingan Anda. Saya menemukan jawabannya dari dokumentasi Keras (lihat jawaban berikut). Saya tidak perlu digabungkan untuk pertanyaan saya.
Rkz

@Rkz: Lihat edit terakhir, saya juga menunjukkan cara mengkompilasi dan menyesuaikan model.
moh
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.