如何在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 2.0 的自定义训练循环中应用回调