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

数据挖掘 机器学习 Python 深度学习 喀拉斯 张量流
2021-10-11 20:44:59

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

例如在附图中,我想获取中间层 A2 维度为 8,并将其用作图层的输入 B1 (再次为 8 维)在模型中 B 然后结合两个模型 A 和型号 B 作为一个单一的模型。

我正在使用功能模块来创建模型 A 和型号 B独立。我怎样才能完成这项任务?

注意A1是要建模的输入层AB1是要建模的输入层B.

见图片

2个回答

我想出了我的问题的答案,这是基于上述答案的代码。

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 中,有一种有用的方法来定义模型:使用函数式 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