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

修改h5文件以修复Keras I/O错误,keras,theano,h5py,Keras,Theano,H5py,几周前,我使用Keras和Theano后端训练了一个卷积神经网络(CNN),并将其保存为h5文件 但今天,当我试图打开它时,我从Theano bn.py文件中得到了BatchNormalization层的以下错误: ValueError:ε必须至少为1e-5,got为9.99999974738e-06 下面是我的问题: 我能和Keras一起解决这个问题吗 如果第一个问题没有答案,我如何修改h5文件以手动修改此值 这是这个问题的临时解决办法。自上一个版本(第220行和第380行)以来,Theano

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

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

ValueError:ε必须至少为1e-5,got为9.99999974738e-06

下面是我的问题:

  • 我能和Keras一起解决这个问题吗
  • 如果第一个问题没有答案,我如何修改h5文件以手动修改此值

  • 这是这个问题的临时解决办法。自上一个版本(第220行和第380行)以来,Theano文件bn.py有两个类似的测试,这些测试负责解决问题:

    if epsilon < 1e-5:
        raise ValueError("epsilon must be at least 1e-5, got %s" % str(epsilon))
    
    如果ε<1e-5:
    raise VALUERROR(“epsilon必须至少为1e-5,获取%s”%str(epsilon))
    
    暂时的解决办法是用做作来代替加薪:

    if epsilon < 1e-5:
       epsilon = 1e-5
    
    如果ε<1e-5:
    ε=1e-5
    

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

    将我的案例发布以供将来参考,因为它将我带到了这里

    在我的例子中,我没有与OP相同的错误,但我有一个h5文件的问题,该文件经过训练并保存,但由于:
    TypeError:arg 5(closure)必须是tuple
    ,因此无法加载。我最终临时修改了来自的lambda反序列化函数中的keras代码

    这将绕过有问题的lambda函数。它对我有效,因为特定h5中的特定lambda函数只是充当
    lambda x:x
    ,尽管它有点复杂

    然后我编写了一个小脚本,加载模型并将其保存在一个新文件中(使用绕过的lambda层)

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