修改 h5 文件以修复 Keras 的错误 I/O

Modify h5 file to fix error with Keras I/O

几周前,我使用 Keras 和 Theano 后端训练了一个卷积神经网络 (CNN),并将其保存为 h5 文件。

但是今天当我试图打开它时,我收到了 BatchNormalization 层的错误,来自 Theano bn.py 文件:

ValueError: epsilon must be at least 1e-5, got 9.99999974738e-06

所以这是我的问题:

  1. 我可以用 Keras 解决这个问题吗?
  2. 如果第一个问题没有答案,如何修改h5文件来手动修改这个值?

这里临时解决这个问题。 Theano 文件 bn.py 自上一版本以来有两个类似的测试(大约第 220 和 380 行),这些测试是造成问题的原因:

if epsilon < 1e-5:
    raise ValueError("epsilon must be at least 1e-5, got %s" % str(epsilon))

临时解决方案是用矫揉造作代替加薪:

if epsilon < 1e-5:
   epsilon = 1e-5

它并不理想,但它允许读取旧文件。不要忘记事后撤消此修改。

发布我的案例以供将来参考,因为 duckduckgo.com 把我带到了这里。

在我的例子中,我没有遇到与 OP 相同的错误,但我遇到了同样的问题,即 h5 文件已经过训练和保存,但由于 keras issue 2814: TypeError: arg 5 (closure) must be tuple. I ended up modifying temporarily the keras code in the lambda deserialization function keras.layers.core.Lambda.from_config 来自

    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')