我有一个Keras模型定义如下:
model = Sequential()
model.add(embedding_layer)
model.add(Conv1D(filters=256, kernel_size=3, activation='relu', padding='same'))
model.add(MaxPooling1D(pool_size=3))
model.add(Flatten())
model.add(Dense(num_classes, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam')
在Flatten()
图层之后,我想连接2个附加功能,即如果Flatten()
给我一个大小为(1,n)(model.output_shape == (None, n)
)的向量,我想要连接一个单独的numpy
数组(1,2),所以model.output_shape == (None, n+2)
。我该怎么做呢?
我认为keras.layers.merge.Concatenate
是我在这里寻找的,但我不知道如何实现它。在线的例子不多,Keras 2.0也使用了更新的语法。任何帮助将不胜感激。
答案 0 :(得分:6)
我玩了一下然后想出来了。对于任何有兴趣的人来说:这是Keras'功能API,它总是返回张量,你可以在其上进行张量运算。
embedded_sequence = embedding_layer(sequence_input)
x = Conv1D(filters=256, kernel_size=3, activation='relu', padding='same')(embedded_sequence)
x = MaxPooling1D(pool_size=3)(x)
x = Flatten()(x)
# additional features input
from keras.layers.merge import Concatenate
af_input = Input(shape=(data['af_train'].shape[1],), name='af_input')
x = Concatenate()([x, af_input])
# output
main_output = Dense(num_classes, activation='sigmoid', name='main_output')(x)
model = Model(inputs=[sequence_input, af_input], outputs=main_output)
model.compile(loss='binary_crossentropy', optimizer='adam')
答案 1 :(得分:0)
我没有测试过这段代码,但是我做了something similar并且它有效(虽然可能不是最有效的方法):
model = Sequential()
model.add(embedding_layer)
model.add(Conv1D(filters=256, kernel_size=3, activation='relu', padding='same'))
model.add(MaxPooling1D(pool_size=3))
model.add(Flatten())
auxiliary_input = Input(shape=(2,), name='aux_input')
final_model = Sequential()
final_model.add(Merge([model, auxiliary_input], mode='concat'))
final_model.add(Dense(num_classes, activation='sigmoid'))
final_model.compile(loss='binary_crossentropy', optimizer='adam')
还有一个part of doc给出了具有多个输入(以及多个输出)的示例,但使用了较旧的API使用方式。