Об’єднання двох різних моделей у Keras


26

Я намагаюся об'єднати дві моделі Кераса в одну модель, і я не в змозі цього досягти.

Наприклад, на малюнку, що додається, я хотів би отримати середній шар розміру 8 і використовувати це як вхід до шару (знову ж розмірності 8) в моделі а потім поєднати як модель і модель як єдину модель.А2Б1БАБ

Я використовую функціональний модуль для створення моделі і модель незалежно один від одного. Як я можу виконати це завдання?АБ

Примітка : являє собою вхідний шар для моделі і є вхідним шаром моделі .А1АБ1Б

Див. Малюнок

Відповіді:


22

Я зрозумів відповідь на моє запитання, і ось код, який спирається на вищевказану відповідь.

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)

і ось структура виводу, яку я хотів:

введіть тут опис зображення


Зауважте, що ви не зливаєте дві моделі (у значенні Керас Модель) у вищезгаданому, ви зливаєте шари.
помер

7

У Кераса є корисний спосіб визначення моделі: використання функціонального API . За допомогою функціонального API ви можете визначати спрямовані ациклічні графіки шарів, що дозволяє будувати повністю довільні архітектури. Розглядаючи ваш приклад:

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

Отже, це все! Ви можете побачити результат 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      

Дякую за відповідь, але я не думаю, що наведений вище код буде працювати. По-перше, коли ви скажете B = models.Model (входи = A2, виходи = B3), це дасть вам помилку TypeError: Вводити шари до Modelобов'язкових повинні бути InputLayerоб'єкти. Отримані входи: Тензор. Також, як згадувалося раніше, я використовував функціональний API, щоб створити модель A і модель B окремо. Я думаю, що відповідь, яку я шукаю, може мати відношення до розділу "Моделі з декількома входами та множинними висновками" в документації keras, який використовує функцію з'єднання (хоча не все впевнене).
Rkz

@Rkz: Відповідь я відредагував. Це працює і зараз. Доводиться використовувати "конкатенат". Власне, вам слід згадати головний вхід (A1), коли ви хочете визначити модель "B".
moh

Дякуємо за Ваш час та зміни. Я зрозумів відповідь з документації Keras (див. Наступну відповідь). Я не вимагав конкатената для свого запитання.
Rkz

@Rkz: Подивіться на остаточну редакцію, я також показую, як скласти та підходити до моделі.
moh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.