跟随Nicholas Renotte人脸识别教程时L1Dist层减法报错求助
Siamese网络L1Distance层减法报错解决
问题根源
你的L1Dist.call()方法收到的参数是列表而非预期的KerasTensor,这是因为构建模型时调用L1Dist层的方式错了——把两个张量打包成列表传入,而非作为独立参数传递。
解决方案
1. 保留L1Dist层的原始实现(无需修改)
class L1Dist(tf.keras.layers.Layer): def __init__(self, **kwargs): super().__init__() def call(self, input_embedding, validation_embedding): return tf.math.abs(input_embedding - validation_embedding)
2. 修正层的调用方式
错误调用(导致参数变列表):
l1_layer = L1Dist() # 错误:把两个张量放在列表里传递 distance = l1_layer([input_embedding, validation_embedding])
正确调用(独立传参):
l1_layer = L1Dist() # 正确:分别传入两个张量 distance = l1_layer(input_embedding, validation_embedding)
为什么之前的修改无效
你尝试的tf.convert_to_tensor、tf.squeeze等操作都是无效的——列表内部已经是KerasTensor,问题根源在调用层的方式,而非层内部的计算逻辑。
验证方法(可选)
在call方法中添加打印语句,确认参数类型:
def call(self, input_embedding, validation_embedding): print(type(input_embedding)) # 正常应输出 <class 'keras.engine.keras_tensor.KerasTensor'> return tf.math.abs(input_embedding - validation_embedding)
内容的提问来源于stack exchange,提问作者Grigorev Nikita
相关产品推荐
相关产品推荐

