基于Inception3的二分类图像模型加载后评估报错求助
我之前在TensorFlow 1.14.0-rc1搭配Keras 2.2.4-tf的环境下,用InceptionV3训练二分类图像分类器时,也碰到过完全一样的问题:训练完成后直接评估模型一切正常,但保存模型再重新加载,用手动创建的tf.Session评估就会抛出FailedPreconditionError,提示变量未初始化。
问题根源
在TensorFlow 1.x版本中,Keras有自己的会话管理机制。你当前的代码逻辑有个关键问题:在加载模型之前就执行了sess.run(tf.global_variables_initializer()),这时候模型的变量还没被创建,等于初始化了个空集;等加载模型后,新生成的变量并没有在当前会话中被初始化,自然会提示找不到变量。
解决方案
这里有两种可靠的解决方式,根据你的需求选择:
方式一:让Keras自动管理会话(推荐)
最简单的办法就是去掉手动创建的tf.Session,让Keras自己处理会话逻辑,这也是Keras在TF1.x中的默认使用方式:
# 无需手动创建Session new_model = tf.keras.models.load_model('mymodel.h5') new_model.summary() eval_model = new_model.evaluate(image_test, label_test)
方式二:手动关联Session和Keras(必须用Session时)
如果你的业务逻辑必须手动创建会话,那需要调整步骤顺序:先加载模型,再初始化变量,并且要告诉Keras使用当前的会话:
with tf.compat.v1.Session() as sess: # 先加载模型 new_model = tf.keras.models.load_model('mymodel.h5') # 加载完成后,初始化所有变量 sess.run(tf.global_variables_initializer()) # 关键:让Keras绑定当前会话 tf.keras.backend.set_session(sess) new_model.summary() eval_model = new_model.evaluate(image_test, label_test)
这里的tf.keras.backend.set_session(sess)是核心,它会让Keras后续的所有操作都使用你手动创建的会话,避免出现会话不共享导致的变量找不到问题。
补充说明
训练完成后直接评估没问题,是因为训练过程中Keras已经在自己的会话里完成了所有变量的初始化,此时模型的变量都处于可用状态;但保存再加载后,新的模型实例相当于重新构建了变量图,必须在当前会话中重新初始化才能使用。
内容的提问来源于stack exchange,提问作者user3050590

