在 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 层?