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.