在Keras中合并两种不同的模型


25

我正在尝试将两个Keras模型合并为一个模型,但是我无法实现这一点。

例如在附图中,我想获取尺寸为8 的中间层,并将其用作模型(再次为尺寸8的)层输入,然后将模型和模型合并为一个模型。B 1 B A BA2B1BAB

我正在使用功能模块独立创建模型和模型如何完成这项任务?AB

注意:是模型的输入层,而是模型的输入层。A B 1 BA1AB1

看图片

Answers:


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模型而言),而是在合并图层。
gented

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      

感谢您的回答,但是我认为上面的代码不起作用。首先,当您说B = models.Model(inputs = A2,outputs = B3)时,将出现错误TypeError:输入的图层Model必须是InputLayer对象。收到的输入:张量。另外,如前所述,我确实使用功能API分别创建了模型A和模型B。我认为我正在寻找的答案可能与使用连接功能的keras文档中的“多输入和多输出模型”部分有关(虽然不是很确定)。
Rkz

@Rkz:我已经编辑了答案。现在可以使用了。我们必须使用“连接”。实际上,在定义模型“ B”时应提及主输入(A1)。
moh

感谢您的宝贵时间和修改。我从Keras文档中找出了答案(请参阅以下答案)。我的问题不需要连接。
Rkz

@Rkz:查看最终编辑,我还将展示如何编译和拟合模型。
moh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.