Слияние двух разных моделей в Керасе

26

Я пытаюсь объединить две модели Keras в одну модель и не могу этого сделать.

Например, на прилагаемом рисунке я хотел бы получить средний слой измерения 8 и использовать его в качестве входных данных для слоя (снова размера 8) в модели а затем объединить и модель и модель как один модель.A2В1ВAВ

Я использую функциональный модуль для создания модели и модель независимо друг от друга. Как я могу выполнить эту задачу?AВ

Примечание : представляет собой входной слой для модели и является входным слоем модели .A1AВ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)

и вот структура вывода, которую я хотел:

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

РКЗ
источник
Обратите внимание, что вы не объединяете две модели (в смысле keras Model) в вышеприведенном, вы объединяете слои.
Генет
7

В Keras есть полезный способ определения модели: использование функционального 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      
MoH
источник
Спасибо за ответ, но я не думаю, что приведенный выше код будет работать. Во-первых, когда вы говорите, что B = models.Model (входы = A2, выходы = B3), вы получите ошибку TypeError: Входные слои Modelдолжны быть InputLayerобъектами. Полученные входные данные: Тензор. Кроме того, как уже упоминалось ранее, я использовал функциональный API для создания Модели A и Модели B по отдельности. Я думаю, что ответ, который я ищу, может быть связан с разделом «Модели с несколькими входами и несколькими выходами» в документации keras, которая использует функцию сцепления (хотя и не полностью).
Ркз
@Rkz: я отредактировал ответ. Это работает сейчас. Мы должны использовать «сцепление». На самом деле, вы должны упомянуть основной вход (A1), когда вы хотите определить модель «B».
Мох
Спасибо за ваше время и изменения. Я разобрался с ответом из документации Keras (см. Следующий ответ). Я не требовал объединения для моего вопроса.
Ркз
@Rkz: Посмотрите на окончательное редактирование, я также покажу, как скомпилировать и подогнать модель.
Мох