加载Siamese神经网络模型时出现NameError:name 'K' is not defined
解决Siamese模型加载时
K is not defined错误 问题原因
你的Siamese模型包含一个使用自定义euclidean_distance函数的Lambda层,该函数依赖keras.backend as K。加载模型时,recognize.py中既没有导入K,也没有提供该自定义函数的定义,导致Keras无法解析Lambda层的逻辑。
解决方案
修改recognize.py,补充必要的导入和自定义函数定义,加载模型时指定custom_objects参数:
import cv2 import numpy as np from keras.models import load_model from keras import backend as K # 导入Keras后端 from utils import load_embeddings # 复制train.py中定义的欧氏距离函数,保证和训练时完全一致 def euclidean_distance(vectors): featsA, featsB = vectors sumSquared = K.sum(K.square(featsA - featsB), axis=1, keepdims=True) return K.sqrt(K.maximum(sumSquared, K.epsilon())) # 加载模型时传入自定义函数 siamese_model = load_model('models/siamese_model.h5', compile=False, custom_objects={'euclidean_distance': euclidean_distance})
注意事项
- 确保
euclidean_distance函数的代码和train.py中完全一致,不能有任何改动,否则模型加载会失败。 - 你的环境使用独立的
keras包而非tensorflow.keras,所以全程保持from keras.X的导入方式,不要混用tensorflow.keras。
内容的提问来源于stack exchange,提问作者Mai Thanh Bình
相关产品推荐
相关产品推荐

