加载TensorFlow .pb模型时Lambda层报错的问题排查与修复
问题原因
- 模型依赖模块未加载:模型保存时依赖仓库内的
solvers.networks.base7模块定义,但测试脚本未导入该模块,导致TensorFlow无法解析Lambda层的关联逻辑,提前抛出警告。 - Keras后端引用未定义:原模型的Lambda层使用了
K.clip(Keras后端的裁剪方法),但测试脚本未导入Keras后端K,加载模型时Lambda层的匿名函数找不到K的定义,触发NameError。
修复方案
方案一:在测试脚本中补全依赖导入
修改测试脚本,添加必要的模块导入,确保Python能找到模型定义的模块,同时导入Keras后端:
import tensorflow as tf from tensorflow.keras import backend as K import cv2 import numpy as np import sys # 将仓库根目录添加到Python路径,确保能导入solvers模块 sys.path.append('./SR_Mobile_Quantization-master') # 替换为你的仓库实际路径 from solvers.networks.base7 import * model_dir = './experiment/base7_D4C28_bs16ps64_lr1e-3/best_status' image_path = 'sample.png' image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.resize(image, (256, 256)) input_data = image[np.newaxis].astype(np.float32) # 加载模型,若仍有问题可指定custom_objects model = tf.keras.models.load_model(model_dir, custom_objects={'K': K}) output = model.predict(input_data) output = cv2.cvtColor(output[0], cv2.COLOR_RGB2BGR) cv2.imshow('hr', output) cv2.waitKey(0) cv2.destroyAllWindows()
方案二:修改原模型定义(需重新保存模型)
如果有权限修改原仓库代码,可将base7.py中的K.clip替换为TensorFlow原生方法,避免依赖Keras后端:
打开SR_Mobile_Quantization-master/solvers/networks/base7.py,找到第27行:
clip_func = Lambda(lambda x: K.clip(x, 0., 255.))
修改为:
clip_func = Lambda(lambda x: tf.clip_by_value(x, 0., 255.))
重新训练或保存模型后,测试脚本无需额外导入K即可正常加载模型。
内容的提问来源于stack exchange,提问作者angel_30
相关产品推荐
相关产品推荐

