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

时间:2020-05-19 12:34:25

标签: python tensorflow keras 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)

2 个答案:

答案 0 :(得分:8)

在您的类的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)是使用列表实现的。

答案 1 :(得分:0)

以这种方式尝试

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()