【问题标题】:Keras: concatenating model flattened output with vectorKeras:将模型扁平化输出与向量连接起来
【发布时间】:2017-08-18 01:47:45
【问题描述】:

我有一个这样定义的 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() 层之后,我想连接两个附加特征,即如果Flatten() 给我一个大小为(1, n) (model.output_shape == (None, n)) 的向量,我想连接一个单独的numpy 数组大小为 (1, 2) 所以model.output_shape == (None, n+2)。我该怎么做呢?

我认为keras.layers.merge.Concatenate 是我在这里寻找的,但我不知道如何实现它。网上的例子不多,Keras 2.0 也使用了更新的语法。任何帮助将不胜感激。

【问题讨论】:

    标签: python numpy deep-learning keras


    【解决方案1】:

    我玩了一会儿,弄明白了。对于任何感兴趣的人:这是 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')
    

    【讨论】:

    • 您的 sequence_input 设置是什么?在 2.0.3 中我无法设置它
    • 我的sequence_input 是文本索引。 sequence_input = Input(shape=(max_sequence_length, ), dtype='int32', name='text_input')
    【解决方案2】:

    我还没有测试过这段代码,但我测试了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 使用样式的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2018-10-19
      • 2019-09-17
      • 2020-11-08
      • 2020-05-26
      • 2019-01-02
      • 2019-12-23
      相关资源
      最近更新 更多