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



我正在寻找在两个 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 实际上来自同一变量的信息,应该一起考虑。通过上面的架构,我想确保网络在将它们与其他变量相关联之前将这些值一起考虑。我希望这是有道理的,如果没有,请告诉我为什么。

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

您要查找的是 Kerasfunctional 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])

最新更新