如何修复L1Dist.call()方法签名与Layer基类不匹配的问题?
修复Layer子类call方法签名不匹配问题
问题原因:TensorFlow的Layer基类中,call方法的标准签名为call(self, inputs, *args, training=None, mask=None),你的自定义L1Dist.call()直接定义了两个位置参数,与基类签名不兼容,导致报错。
修复方案有两种,推荐第一种符合Keras API规范的写法:
方案一:将多输入合并为元组/列表传入
修改call方法接受单个inputs参数,再拆分为所需的两个输入,同时修正__init__方法传递父类初始化参数:
import tensorflow as tf from tensorflow.keras.layers import Layer class L1Dist(Layer): def __init__(self, **kwargs): super().__init__(**kwargs) # 传递kwargs给父类初始化 def call(self, inputs, **kwargs): input_embedding, validation_img = inputs return tf.math.abs(input_embedding - validation_img)
使用时需将两个输入打包为列表传入:
l1_layer = L1Dist() output = l1_layer([input_embedding_tensor, validation_img_tensor])
方案二:兼容基类签名的多参数写法
如果希望保留两个位置参数,需添加可变参数以匹配基类签名:
import tensorflow as tf from tensorflow.keras.layers import Layer class L1Dist(Layer): def __init__(self, **kwargs): super().__init__(**kwargs) def call(self, input_embedding, validation_img, *args, **kwargs): return tf.math.abs(input_embedding - validation_img)
这种写法可以直接传入两个参数,但不符合Keras Layer的常规输入模式,不推荐在复杂模型中使用。
内容的提问来源于stack exchange,提问作者Prateek
相关产品推荐
相关产品推荐

