在 Keras 中添加 vs Concatenate 层

Add vs Concatenate layer in Keras

我正在研究一些不同的神经网络架构,并试图拼凑出如何自己重新创建它们。

我 运行 关注的一个问题是 Keras 中 Concatenate()Add() 层之间的功能差异。看起来他们完成了类似的事情(将多个层组合在一起),但我不太清楚两者之间的真正区别。

这是一个示例 keras 模型,它接受两个单独的输入然后将它们组合起来:

inputs1 = Input(shape = (32, 32, 3))
inputs2 = Input(shape = (32, 32, 3))
x1      = Conv2D(kernel_size = 24, strides = 1, filters = 64, padding = "same")(inputs1)
x1      = BatchNormalization()(x1)
x1      = ReLU()(x1)
x1      = Conv2D(kernel_size = 24, strides = 1, filters = 64, padding = "same")(x1)

x2      = Conv2D(kernel_size = 24, strides = 1, filters = 64, padding = "same")(inputs2)
x2      = BatchNormalization()(x2)
x2      = ReLU()(x2)
x2      = Conv2D(kernel_size = 24, strides = 1, filters = 64, padding = "same")(x2)
add     = Concatenate()([x1, x2])
out     = Flatten()(add)
out     = Dense(24, activation = 'softmax')(out)
out     = Dense(10, activation = 'softmax')(out)
out     = Flatten()(out)
mod     = Model([inputs1, inputs2], out)

我可以用 Concatenate() 层替换 Add() 层,一切正常,模型 看起来 相似,但我很难时间了解差异。

作为参考,下面是每个带有 keras 的 plot_model 函数的图:

具有附加层的 KERAS 模型:

具有连接层的 KERAS 模型:

我注意到当你连接你的模型尺寸时比添加层更大。是否是串联的情况,您只是将前几层的权重堆叠在一起,然后使用 Add() 将值加在一起?

好像应该更复杂,但我不确定。

正如你所说,它们都结合了输入,但它们结合的方式不同。 他们的名字已经暗示了他们的用法

Add() 输入相加,
例如(假设 batch_size=1)

x1 = [[0, 1, 2]]
x2 = [[3, 4, 5]]
x = Add()([x1, x2])

那么x应该是[[3, 5, 7]],这里每个元素都加
注意输入形状是 (1, 3) 和 (1, 3),输出也是 (1, 3)

Concatenate() 连接输出,
例如(假设 batch_size=1)

x1 = [[0, 1, 2]]
x2 = [[3, 4, 5]]
x = Concatenate()([x1, x2])

那么 x 应该是 [[0, 1, 2, 3, 4, 5]],其中输入水平堆叠在一起,
注意输入形状是 (1, 3) 和 (1, 3),输出也是 (1, 6),

即使张量具有更多维度,类似的行为仍然适用。

Concatenate 会创建一个更大的模型,原因很明显,输出大小就是所有输入总和的大小,而 add 与输入之一的大小相同


有关 add/concatenate 以及组合多个输入的其他方法的详细信息,请参阅 this