我正在寻找一种方法来定义两个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 layer0 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实际上来自同一个变量并且应该一起考虑的信息。通过上面的架构,我希望确保网络在与其他变量相关联之前一起考虑这些值。我希望这有意义,如果没有,请告诉我为什么。
更新:提供的答案给出了一个很好的代码示例。
回答:
您正在寻找的是Keras的函数式API
。
您可以定义网络的三个输入,然后根据您的喜好在其上构建模型。
from keras.layers import Input, Dense, Conv1D, Concatenatex = 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])