tensorflow - 关于对象破坏的关闭会话

时间:2017-05-15 08:52:30

标签: python python-3.x session tensorflow destructor

所以我有一个带分类器的项目,试图像这样隐藏用户的张量流背景:

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

    # ...

这样,我们希望每次调用trainpredict等时都避免重新加载分类器。

当用户完成分类器/终止脚本时,我们如何关闭 self._session

显而易见的'方法是简单地将其推入__del__并希望它能够解决。

def __del__(self):
    if not self._session._closed:
        self._session.close()

坦率地说,没有看到任何其他方式来处理它。

如果我通过谷歌搜索__del__得到了一件事,那么它总是非常强烈劝阻,因为它与垃圾不会产生协同作用收集器。

那么__del__还有什么路要走,还是我们还没有意识到的替代方案?

1 个答案:

答案 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()