如何在keras中实现具有任意节点连接的前馈网络?

时间:2018-01-05 10:02:55

标签: keras

我是使用keras框架的新手。我已经阅读了一些关于如何使用keras中的Sequential和Graph类构建深度学习模型的示例。但是,我看到,如果我使用Sequential或Graph,它会独立地假设一个层的每个节点都与另一层的所有节点完全连接,不是吗?

我怀疑如下,如果我想构建一个没有完全连接的深度前馈网络,例如第二层的第一个节点没有连接到第三层的第二个节点......等等,即使我想在属于非连续层的节点之间添加连接(跳过连接),我如何在keras中实现它?

的奥斯卡

1 个答案:

答案 0 :(得分:1)

您正在寻找在Keras中创建模型的最通用和最标准的方法:功能API Model

跳过连接

这些很容易。创建输入张量。将张量传递给图层,获得输出张量。使用连接或其他操作以后加入它们:     #create输入张量     inputTensor = Input(someInputShape)

#pass the input into the first layer
firstLayerOutput = Dense(n1)(inputTensor)

#pass the output through a second layer 
secondLayerOutput = Dense(n2)(firstLayerOutput)

#get the first output and join with the second output (the first output is skipping the second layer)
skipped = Concatenate()([firstLayerOutput,secondLayerOutput])
finalOutput = Dense(n3)(skipped)

model = Model(inputTensor,finalOutput)

在视觉上,这会创建:

input
  |
Dense1
  |    \
Dense2 |
  |    |
   \  /
  Concat
     |
  Dense3
     |
  Output

自定义节点连接

如果您要更改图层的常规行为,这可能会更复杂。它需要自定义图层和自定义矩阵乘法等。

建议只是使用许多小图层,并根据需要制作尽可能多的跳过连接。许多具有1个节点的并行层表示具有许多节点的单个层。

因此,您可以创建大量Dense(1)图层并将其视为节点。然后以任何你喜欢的方式连接它们。