我正在研究一些不同的神經網路架構,并試圖拼湊出如何自己重新創建它們。
我遇到的一個問題是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)
我可以用Add()圖層替換Concatenate()圖層,一切正常,模型看起來很相似,但我很難理解其中的區別。
作為參考,這是每個具有 kerasplot_model功能的圖:
具有附加層的 KERAS 模型:

具有連接層的 KERAS 模型:

我注意到當您連接模型時,模型大小比添加層要大。在串聯的情況下,您是否只是將前一層的權重堆疊Add()在一起,然后將這些值加在一起?
看起來應該更復雜,但我不確定。
uj5u.com熱心網友回復:
正如你所說,它們都結合了輸入,但它們以不同的方式結合。他們的名字已經暗示了他們的用法
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),
即使張量有更多維度,類似的行為仍然適用。
連接創建了一個更大的模型,原因很明顯,輸出大小只是所有輸入的大小之和,而添加與其中一個輸入的大小相同
有關添加/連接以及組合多個輸入的其他方法的更多資訊,請參閱此
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/385049.html
