TensorFlow 1.x中Keras加载自定义模型报错:numpy()仅在eager执行启用时可用
问题
我运行某GitHub仓库中的代码(第186行通过model = keras.models.load_model(file_path)加载机器学习模型),克隆仓库后添加了两行代码以兼容TensorFlow 1.x:
import tensorflow.compat.v1 as tf tf.disable_v2_behavior()
此时加载官方提供的模型文件Adiac1.hdf5可正常运行,但加载我自行训练保存的Adiac2.hdf5时,该行代码抛出错误:
NotImplementedError: numpy() is only available when eager execution is enabled.
想了解两个模型加载存在差异的原因,以及为何部分模型加载需要启用eager执行模式,而部分不需要?
原因分析
- 训练保存的环境版本差异:官方的Adiac1.hdf5是基于TensorFlow 1.x的静态图模式训练并保存的,和你启用的
tf.disable_v2_behavior()环境完全匹配,加载时不需要依赖eager执行。而你自己训练的Adiac2.hdf5,应该是在TensorFlow 2.x环境下完成的——TF2默认开启eager执行,保存模型时会写入依赖eager模式的操作或张量属性,比如某些层的计算逻辑用到了numpy()方法,这类内容在禁用eager的TF1.x兼容环境里无法被解析,直接触发报错。 - 模型保存的细节配置不同:就算是相同的模型架构,保存时的配置也可能有差异。比如你训练Adiac2时,可能使用了TF2特有的层、自定义操作,或者保存时包含了eager模式下的动态计算图信息;而官方模型是纯TF1.x的静态图结构,不存在这些eager相关的依赖项。
- 模型加载逻辑的兼容性限制:
keras.models.load_model()在不同TensorFlow环境下的解析逻辑不一样。禁用eager后,加载器会以TF1.x的静态图方式解析模型文件,一旦遇到TF2保存的、依赖eager的张量或操作,就会触发numpy()相关错误——因为静态图模式下的张量并没有numpy()方法,只有eager模式下的张量才支持这个方法调用。
内容的提问来源于stack exchange,提问作者mahmoud aghvami
相关产品推荐
相关产品推荐

