我想实现一个名为tf.keras
的自定义MyLayer
层,它具有三个输入并包含一个子层,该子层又具有三个输入,如下图所示:
我认为正确的做法是创建一个扩展MyLayer
的{{1}}类并实现tf.keras.layers.Layer
,__init__
和build
方法,如official documentation中所述。
现在,文档中提供的示例是相对于非常简单的层的,这些层由以顺序方式(即一个接一个地连接)的几个子层组成。例如,MLPBlock
层由顺序排列的3个线性层组成。
但是,通常,子层不是顺序排列的,而是可以形成分支的。这表明这些层可以并行运行,因为它们没有相互连接。
回到我要实现的定制层,您可以看到call
,Layer1
和Layer2
可以并行运行。一旦计算出它们的输出,就可以将它们馈送到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])
,Layer1
和Layer2
是顺序运行的,而不是并行运行的。
我想出的一种可能的解决方案涉及将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(...)
的最佳方法是什么吗?