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

时间:2017-05-15 23:15:30

标签: keras theano h5py

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

但今天当我尝试打开它时,我从Theano bn.py文件中收到BatchNormalization图层的错误:

  

ValueError:epsilon必须至少为1e-5,得到9.99999974738e-06

所以这是我的问题:

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

2 个答案:

答案 0 :(得分:1)

这是此问题的临时解决方案。 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

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

答案 1 :(得分:1)

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

在我的情况下,我没有与OP相同的错误,但我遇到了同样的问题,即有一个h5文件经过培训并保存但由于keras issue 2814而无法加载:{{1} }。我最后暂时修改了来自

的lambda反序列化函数keras.layers.core.Lambda.from_config中的keras代码
TypeError: arg 5 (closure) must be tuple

    elif function_type == 'lambda':
        # Unsafe deserialization from bytecode
        function = func_load(config['function'], globs=globs)

这绕过了违规的lambda函数。它对我有用,因为特定的h5中的特定lambda函数只是作为 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图层)

lambda x: x