修改 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
所以这是我的问题:
- 我可以用 Keras 解决这个问题吗?
- 如果第一个问题没有答案,如何修改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')
几周前,我使用 Keras 和 Theano 后端训练了一个卷积神经网络 (CNN),并将其保存为 h5 文件。
但是今天当我试图打开它时,我收到了 BatchNormalization 层的错误,来自 Theano bn.py 文件:
ValueError: epsilon must be at least 1e-5, got 9.99999974738e-06
所以这是我的问题:
- 我可以用 Keras 解决这个问题吗?
- 如果第一个问题没有答案,如何修改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')