Keras中的模型合并有何意义?


10

我了解到Keras具有根据以下功能“合并”两个模型的功能:

from keras.layers import Merge

left_branch = Sequential()
left_branch.add(Dense(32, input_dim=784))

right_branch = Sequential()
right_branch.add(Dense(32, input_dim=784))

merged = Merge([left_branch, right_branch], mode='concat')

Mergint神经网络有什么意义,在什么情况下有用?这是一种整体建模吗?在性能上,几种“模式”(concat,avg,点等...)之间有什么区别?

Answers:


14

出于多种原因使用它,基本上是将多个网络连接在一起。一个很好的例子是您有两种类型的输入,例如标签和图像。您可以建立一个网络,例如具有:

图像->转化->最大合并->转化->最大合并->密集

标记->嵌入->密集层

要将这些网络组合成一个预测并一起训练,可以在最终分类之前合并这些密集层。

具有多个输入的网络是它们最“明显”的用法,这是在RNN内将单词和图像结合在一起的图片,“多峰”部分是将两个输入合并的地方:

多峰神经网络

另一个示例是Google的Inception层,在该层中,您可以将不同的卷积加在一起,然后再进入下一层。

要将多个输入馈送给Keras,您可以传递数组列表。在单词/图像示例中,您将有两个列表:

x_input_image = [image1, image2, image3]
x_input_word = ['Feline', 'Dog', 'TV']
y_output = [1, 0, 0]

然后,您可以适合以下情况:

model.fit(x=[x_input_image, x_input_word], y=y_output]

抱歉,我看不到为训练实例和标签建立单独的网络的意义,尽管有可能在拟合阶段将它们提供到单个网络中,但还是可以完成工作。我可以看到合并是一种可能性,但与“非合并”相比,它不是优势。
Hendrik

在试穿阶段如何喂食它们?输入始终是单独的,您不能在标签上使用卷积层,因此需要以某种方式合并这些层。
Jan van der Vegt

在Keras中model.fit(),X和y都接受拟合,model在这种情况下,也可以是“非合并”模型。例如,与Sklearn中的其他模型类型非常相似。
Hendrik

3
在我看来,标签可能是一个不好选择的名字,假设您有一张图片和带有该图片的注释,并且您想要对这种组合是否与猫有关的类别进行分类,那么您有两种输入方式,一种是二进制输出方式。为了获得它们之间的协同作用,您将必须将图层合并到某个位置。另一个示例是您有两张图片,必须将它们分类在一起,分别是从上到下和从下到上
Jan van der Vegt

3
@Hendrik:没有“组件模型”,只有一个模型。这是一个复杂的过程,由图层合并功能启用。您可以像对任何单个模型一样对它进行评估-即使用针对保持测试数据集的度量(在图像/单词示例中,数据包括图像,关联的部分文本和下一个要预测的单词)。如果需要,您可以检查模型中的图层以查看其功能-例如,对CNN特征的分析仍可以应用于卷积图层。
尼尔·斯莱特
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.