在 Keras 中添加 vs 连接层

Posted

技术标签:

【中文标题】在 Keras 中添加 vs 连接层【英文标题】:Add vs Concatenate layer in Keras 【发布时间】:2022-01-20 19:34:14 【问题描述】:

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

我遇到的一个问题是 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() 将这些值加在一起?

看起来应该更复杂,但我不确定。

【问题讨论】:

【参考方案1】:

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

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

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

那么 x 应该是 [[3, 5, 7]],其中添加了每个元素 注意输入shape是(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]],其中输入水平堆叠在一起, 注意输入shape是(1, 3)和(1, 3),输出也是(1, 6),

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

出于一个明显的原因,Concatenate 创建了一个更大的模型,输出大小只是所有输入总和的大小,而 add 与其中一个输入具有相同的大小


有关添加/连接以及组合多个输入的其他方式的更多信息,请参阅this

【讨论】:

以上是关于在 Keras 中添加 vs 连接层的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 自定义层中连接多个形状为 (None, m) 的 LSTM 输出

使用 Keras 注意力在 sequence2sequence 模型中连接层形状误差

如何在 Keras、RepeatVector 或 return_sequence=True 中连接 LSTM 层?

tf.keras.Concatenate Graph 连接两个输入层时断开连接

Keras官方中文文档:局部连接层Locally

连接 Keras 中的屏蔽输入