错误原因
在使用TensorFlow进行模型训练时,当在某些操作完成之后没有显式地关闭Session或者Session已经被关闭之后再去调用Session.run()函数时,就会报"InvalidStateError: Cannot call run() after the session has been closed "的错误。
解决方法
显式关闭Session
在使用TensorFlow API构建训练模型时,我们一般会通过创建一个Session对象并在该对象上运行操作来完成训练。因此,在训练完成后,我们需要显式地关闭Session对象。这可以通过使用Session.close()函数实现。推荐使用with语句来创建Session对象,因为它可以自动管理Session的生命周期,即自动关闭Session。
示例如下:
import tensorflow as tf
# 创建一个Graph对象
graph = tf.Graph()
with graph.as_default():
# 构建训练模型
# 创建一个Session对象
with tf.Session(graph=graph) as sess:
# 训练模型
sess.run(train_op)
# 关闭Session对象
sess.close()
合理使用Session
如果我们在运行Session.run()函数之前就关闭了Session,那么就会出现上述错误。因此,在使用Session实例时,我们要始终保证在Session.run()函数调用之前没有关闭Session,可以采用以下两种方法:
- 使用with语句,会自动管理Session对象的生命周期,确保Session在适当的时候被关闭。
import tensorflow as tf
with tf.Session() as sess:
# 运行操作
sess.run(train_op)
- 在Session.run()函数调用之前,使用Session.as_default()函数将Session设置为默认Session,这样就可以在Session.run()函数调用之后随时关闭Session,而不会报错。
import tensorflow as tf
# 创建一个Session对象
sess = tf.Session()
# 声明sess为默认Session
with sess.as_default():
# 运行操作
sess.run(train_op)
# 关闭Session对象
sess.close()
总结
在使用TensorFlow进行模型训练时,为避免"InvalidStateError: Cannot call run() after the session has been closed "的错误,我们应该始终保证在Session.run()函数调用之前没有关闭Session。
可以使用with语句管理Session对象的生命周期,或者在Session.run()函数调用之前使用Session.as_default()函数将Session设置为默认Session,确保在Session.run()函数调用之后随时关闭Session对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解TensorFlow报”InvalidStateError: Cannot call run() after the session has been closed “的原因以及解决办法 - Python技术站