两个Keras层之间的自定义(卷积)连接

时间:2018-01-17 07:57:34

标签: machine-learning neural-network keras conv-neural-network

我正在寻找在两个Keras层之间定义自定义互连的可能性。我想用自定义和不同数量的输入来模仿卷积行为。以下简要描述的简化示例说明了我的需求。输入0,1和2应合并为一个单元。输入3应单独考虑,4和5也应合并。在该示例中,输入组(0,1,2),(3)和(4,5)总是组合在一个神经元中。进一步的步骤是在几个神经元中的组合(例如,将0,1和2输入到两个隐藏层神经元中)。

       X        Output layer
    /  |  \
  X    X   X    Hidden layer
 /|\   |  / \
X X X  X  X X   Input layer
0 1 2  3  4 5

我没有在Keras文档中找到这个问题的直接解决方案,也许我正在寻找错误的地方。卷积层总是期望固定数量的输入值。这个问题对我来说似乎并不复杂。我没有提供任何代码,因为还没有什么值得分享的。但是,当我找到有效的解决方案时,我会用代码更新问题。

也许是这个问题的一些背景知识。我将分类值分成热矢量。例如,具有三种表现形式的分类值' a'' b'' c'进入(1,0,0),(0,1,0)和(0,0,1)。这些与其他值一起被馈入神经网络。导致上述示例网络的输入(1,0,0,X,X,X),(0,1,0,X,X,X)和(0,0,1,X,X,X) (X表示任意值)。当我现在有一个完全连接的层时,网络会丢失输入0,1和2实际上来自同一个变量的信息,应该一起考虑。使用上面的体系结构,我想确保网络在将这些值与其他变量关联之前将这些值一起考虑。我希望这是有道理的,如果不是,请告诉我原因。

更新: 答案提供了一个很好的代码示例。

1 个答案:

答案 0 :(得分:4)

您正在寻找的是Keras functional API

您可以为网络定义三个输入,然后根据需要在其上构建模型。

from keras.layers import Input, Dense, Conv1D, Concatenate
x = Input(shape=(None, 3))
y = Input(shape=(None, 1))
z = Input(shape=(None, 2))
conv_x = Conv1D(...)(x)
conv_y = Conv1D(...)(y)
conv_z = Conv1D(...)(z)
conv = Concatenate(axis=-1)([conv_x, conv_y, conv_z])