在 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
我正在研究一些不同的神经网络架构,并试图拼凑出如何自己重新创建它们。
我 运行 关注的一个问题是 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