以下为部分代码。我试图了解“添加”的作用。为什么在这里添加两个具有不同形状的输入时,添加层的输出(无,38、300)为何?
以下是Keras中的代码。
image_model = Input(shape=(2048,))
x = Dense(units=EMBEDDING_DIM, activation="relu")(image_model)
x = BatchNormalization()(x)
language_model = Input(shape=(MAX_CAPTION_SIZE,))
y = Embedding(input_dim=VOCABULARY_SIZE, output_dim=EMBEDDING_DIM)(language_model)
y = Dropout(0.5)(y)
merged = add([x, y])
merged = LSTM(256, return_sequences=False)(merged)
merged = Dense(units=VOCABULARY_SIZE)(merged)
merged = Activation("softmax")(merged)
答案 0 :(得分:2)
为什么在添加两个输入时添加层的输出(无,38、300) 在这里有不同的形状?
这是一种称为广播的技术。您可以在这里找到更多详细信息:https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
在下面的示例中,第一输入(16,)沿第二输入(2,16)的第二维(2,)广播,因此可以进行逐元素加法。
import keras
import numpy as np
input1 = keras.layers.Input(shape=(16,))
input2 = keras.layers.Input(shape=(2,16))
added = keras.layers.Add()([input1, input2])
model = keras.models.Model(inputs=[input1, input2], outputs=added)
output = model.predict([np.ones((1,16)), np.ones((1,2,16))])
print(output.shape)
print(output)
(1、2、16)
[[[2。 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.] [2。 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2。]]]