Keras:使用向量

时间:2017-03-25 00:11:38

标签: python numpy deep-learning keras

我有一个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也使用了更新的语法。任何帮助将不胜感激。

2 个答案:

答案 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使用方式。