如何在 Tensorflow 2.x Keras 自定义层中使用多个输入?

How to use multiple inputs in Tensorflow 2.x Keras Custom Layer?

我正在尝试在 Tensorflow-Keras 的自定义层中使用多个输入。用法可以是任何东西,现在它被定义为将蒙版与图像相乘。我已经搜索过了,我能找到的唯一答案是 TF 1.x,所以它没有任何用处。

class mul(layers.Layer):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # I've added pass because this is the simplest form I can come up with.
        pass
          
    def call(self, inputs):
        # magic happens here and multiplications occur
        return(Z)

这样试试

class mul(layers.Layer):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # I've added pass because this is the simplest form I can come up with.
        pass

    def call(self, inputs):
        inp1, inp2 = inputs
        Z = inp1*inp2
        return Z

inp1 = Input((10))
inp2 = Input((10))
x = mul()([inp1,inp2])
x = Dense(1)(x)
model = Model([inp1,inp2],x)
model.summary()

编辑:自 TensorFlow v2.3/2.4 起,合约将使用 call 方法的输入列表。对于 keras(不是 tf.keras),我认为下面的答案仍然适用。

在 class 的 call 方法中实现多输入,有两种选择:

  • 列表输入,这里的inputs参数应该是一个包含所有输入的列表,这里的好处是可以变长。您可以索引列表,或使用 = 运算符解压缩参数:

      def call(self, inputs):
          Z = inputs[0] * inputs[1]
    
          #Alternate
          input1, input2 = inputs
          Z = input1 * input2
    
          return Z
    
  • call方法中的多个输入参数,有效但定义层时参数的数量是固定的:

      def call(self, input1, input2):
          Z = input1 * input2
    
          return Z
    

无论您选择哪种方法来实现,都取决于您是需要固定大小还是可变大小的参数。当然,每种方法都会改变调用层的方式,要么通过传递参数列表,要么通过在函数调用中逐个传递参数。

您还可以在第一种方法中使用 *args 以允许具有可变数量参数的 call 方法,但总体上 keras 自己的层接受多个输入(如 ConcatenateAdd) 是使用列表实现的。