Keras'ta iki farklı modeli birleştirmek


25

İki Keras modelini tek bir modelde birleştirmeye çalışıyorum ve bunu başaramıyorum.

Ekli Şekilde Örneğin, orta katman almak istiyoruz boyut 8 ve katman için girdi olarak kullanmak B 1 Modeli (yeniden boyut 8) B modeli hem de daha sonra kombine bir ve model B olarak tek bir model.A2B1BAB

İşlevsel modülü Model ve Model B'yi bağımsız olarak oluşturmak için kullanıyorum . Bu görevi nasıl yapabilirim?AB

Not : , A modeline giriş katmanıdır ve B 1 , B modeline giriş katmanıdır .A1AB1B

Resmi görmek

Yanıtlar:


22

Sorumun cevabını buldum ve işte yukarıdaki cevaba dayanan kod.

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)

ve işte istediğim çıktı yapı:

görüntü tanımını buraya girin


Eğer ki Bildirimi değil yukarıda (keras Modelinin anlamda) iki model birleştirme katmanları birleştirme ediyoruz.
— 07

7

Keras'da bir model tanımlamanın faydalı bir yolu vardır: İşlevsel API'yi kullanma . İşlevsel API ile, tamamen rastgele mimariler oluşturmanıza olanak veren, yönlendirilmiş bir asiklik katman grafiği tanımlayabilirsiniz. Örneğinizi dikkate alarak:

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

Demek bu kadar! Sonucu şöyle görebilirsiniz 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      

Cevap için teşekkürler, ama yukarıdaki kodun işe yarayacağını sanmıyorum. Öncelikle, B = models.Model (girişler = A2, çıkışlar = B3) derken, size bir hata verecektir. TypeError: Giriş katmanları bir nesne Modelolmalıdır InputLayer. Alınan girişler: Tensör. Ayrıca, daha önce de belirtildiği gibi, Model A ve Model B'yi ayrı ayrı oluşturmak için işlevsel API kullandım. Aradığım cevabın birleştirilmiş fonksiyon kullanan keras belgelerinde "Çok girişli ve çok çıkışlı modeller" bölümü ile ilgisi olabilir (sanırım kesin değil).
— Rkz,

@Rkz: Cevabı değiştirdim. Şuan çalışıyor. "Birleştir" kullanmak zorundayız. Aslında, "B" modelini tanımlamak istediğinizde ana girişten (A1) bahsetmelisiniz.
— moh

Zaman ayırdığınız ve düzenlemeleriniz için teşekkür ederiz. Keras belgelerinin cevabını çözdüm (aşağıdaki cevaba bakınız). Sorum için birleştirmek istemedim.
— Rkz

@Rkz: Son düzenlemeye bakın, ayrıca modeli nasıl derleyeceğimi ve uyduğumu göstereceğim.
— moh
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.