所以我有一个带分类器的项目,试图像这样隐藏用户的张量流背景:
class CNN_Classifier:
def __init__(self,
save_as='cnn_classifier.ckpt',
saved_model='cnn_classifier.ckpt'
):
# ...
model_restorable = (
saved_model is not None
and os.path.exists(f'{saved_model}.index')
)
if self.debug:
print('restore from file: {0}'.format('yes' if model_restorable else 'no'))
self._session = tf.Session()
saver = tf.train.Saver(self._tf_variables)
with self._session.as_default():
if model_restorable:
saver.restore(self._session,saved_model)
else:
tf.global_variables_initializer().run()
saver.save(self._session,save_as,write_meta_graph=False)
def train(self,encoding='utf8',*examples):
# makes use of self._session
# periodically saves back to disk
def predict(self,encoding='utf8',query):
# makes use of self._session
# ...
这样,我们希望每次调用train
,predict
等时都避免重新加载分类器。
当用户完成分类器/终止脚本时,我们如何关闭 self._session
?
显而易见的'方法是简单地将其推入__del__
并希望它能够解决。
def __del__(self):
if not self._session._closed:
self._session.close()
坦率地说,我没有看到任何其他方式来处理它。
如果我通过谷歌搜索__del__
得到了一件事,那么它总是非常强烈劝阻,因为它与垃圾不会产生协同作用收集器。
那么__del__
还有什么路要走,还是我们还没有意识到的替代方案?
答案 0 :(得分:0)
从来没有永远在python中使用__del__
- 永远。它会导致难以追踪的痛苦,你的真正花费了几个月的时间。
@AllenLavoie是对的:
class CNN_Classifier:
# your code
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self._session.close()
然后使用你的课程:
with CNN_Classifier() as cnn:
cnn.train()