发布我的案例以供将来参考,因为 duckduckgo.com 将我带到这里。
在我的情况下,我没有遇到与 OP 相同的错误,但我遇到了同样的问题,即有一个经过训练和保存但由于 keras issue 2814:TypeError: arg 5 (closure) must be tuple 而无法加载的 h5 文件。我最终临时修改了 lambda 反序列化函数 keras.layers.core.Lambda.from_config 中的 keras 代码,来自
elif function_type == 'lambda':
# Unsafe deserialization from bytecode
function = func_load(config['function'], globs=globs)
到
elif function_type == 'lambda':
# Unsafe deserialization from bytecode
if 'my_lambda_name' in config['function'][0]:
print('bypassing lambda function')
function = lambda x: x
else:
function = func_load(config['function'], globs=globs)
这绕过了有问题的 lambda 函数。它对我有用,因为该特定 h5 中的特定 lambda 函数只是充当 lambda x: x,尽管它比这更复杂一些。
然后我编写了一个小脚本来加载模型并将其保存在一个新文件中(带有绕过的 lambda 层)
from keras.models import load_model
print('fixing file')
model = load_model('path/to/file.h5')
model.save('path/to/file.fixed.h5')
print('fixed')