Keras-具有多个输入的自定义图层

时间:2020-10-19 09:16:15

标签: python tensorflow keras deep-learning neural-network

我想实现一个名为tf.keras的自定义MyLayer层,它具有三个输入并包含一个子层,该子层又具有三个输入,如下图所示:

MyLayer

我认为正确的做法是创建一个扩展MyLayer的{​​{1}}类并实现tf.keras.layers.Layer__init__build方法,如official documentation中所述。

现在,文档中提供的示例是相对于非常简单的层的,这些层由以顺序方式(即一个接一个地连接)的几个子层组成。例如,MLPBlock层由顺序排列的3个线性层组成。

但是,通常,子层不是顺序排列的,而是可以形成分支的。这表明这些层可以并行运行,因为它们没有相互连接。 回到我要实现的定制层,您可以看到callLayer1Layer2可以并行运行。一旦计算出它们的输出,就可以将它们馈送到Layer3。关键是:如何并行运行它们?我在available Keras layers中找不到任何“ ParallelCombinator”或类似内容。

如果要遵循文档中提供的示例,我将按照以下内容写一些东西:

Layer4

但是,这意味着class MyLayer(keras.layers.Layer): def __init__(self, ...): super(MyLayer, self).__init__() self.layer_1 = Layer1(...) self.layer_2 = Layer2(...) self.layer_3 = Layer3(...) self.layer_4 = Layer4(...) def call(self, inputs): tmp_1 = self.layer_1(inputs[0]) tmp_2 = self.layer_2(inputs[1]) tmp_3 = self.layer_3(inputs[2]) return self.layer4([tmp_1, tmp_2, tmp_3]) Layer1Layer2是顺序运行的,而不是并行运行的。

我想出的一种可能的解决方案涉及将Layer3构造为使用Keras的功能API构建的MyLayer,而不是构造为tf.keras.Model的子类,例如:

tf.keras.Layer

我认为这可行的原因是,我假设当我向def MyLayer(...): input_1 = tf.keras.layers.Input(...) input_2 = tf.keras.layers.Input(...) input_3 = tf.keras.layers.Input(...) layer_1 = Layer1(...)(input_1) layer_2 = Layer2(...)(input_2) layer_3 = Layer3(...)(input_3) output_1 = Layer4(...)([layer_1, layer_2, layer_3]) return tf.keras.Model(inputs=[input_1, input_2, input_3], outputs=output_1) if __name__ == '__main__': my_layer = MyLayer(...) input_1 = ... input_2 = ... input_3 = ... output = my_layer([input_1, input_2, input_3]) 输入一些输入到tf.keras.Model时,可以运行 的层并行有效地并行运行(或者是?)。但是,这种解决方案对我来说就像是一个hack,因为output = my_layer([input_1, input_2, input_3])应该是一个层,而不是一个模型。实际上,MyLayer实例公开了tf.keras.Model之类的方法,这些方法并非要在层上调用。

有人知道实现fit(...)的最佳方法是什么吗?

0 个答案:

没有答案