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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Tensorflow 2.x Keras自定义层中使用多个输入?相关的知识,希望对你有一定的参考价值。

我正在尝试在Tensorflow-Keras的自定义层中使用多个输入。用途可以是任何东西,现在定义为将蒙版与图像相乘。我已经搜索了SO,我唯一能找到的答案是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)
答案

实现多个输入是在您的类的call方法中完成的,有两种选择:

  • 列表输入,这里的inputs参数应该是包含所有输入的列表,这里的优点是它可以是可变大小。您可以使用=运算符索引解压缩参数列表:

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

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

无论选择哪种实现方法,这取决于您需要固定大小的参数还是可变大小的参数。

另一答案

在您的示例中不需要__init__,因为它没有做任何事情。

call可以具有任意数量的参数,因此__init__可以具有任何想要的参数。这是一个示例,只需使用两个参数:

import tensorflow as tf    

class ExampleLayer(tf.keras.layers.Layer):
    def call(self, inputs, mask):
        return inputs * mask

layer = ExampleLayer()
layer(tf.constant([2.0, 3.0, 4.0]), tf.constant([2.0, 3.0, 4.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()

以上是关于如何在Tensorflow 2.x Keras自定义层中使用多个输入?的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow+Keras学习率指数分段逆时间多项式衰减及自定义学习率衰减的完整实例

Tensorflow+Keras学习率指数分段逆时间多项式衰减及自定义学习率衰减的完整实例

tensorflow 测量工具,与自定义训练

在 TensorFlow 2.0 的自定义训练循环中应用回调

使用Keras的模型类将Tensorflow 1.x代码迁移到Tensorflow 2.x

使用 TensorFlow 2.0 Alpha 时无法在 Tensorboard 中看到 keras 模型图