How to use a TensorFlow session as a class attribute
我正在使用会话作为我班级的属性,如
1
| self.sess = tf.Session() |
要么
1
| self.sess = tf.InteractiveSession() |
session属性用于几个函数,例如
1 2
| def get_loss(self, input_data):
return self.sess.run(self.loss, {self.data:input_data}) |
我知道会话必须在某个时候关闭。 将会话用作类的属性时,这是否也适用? 我需要某个地方的"close_session"功能吗? 如果是的话,我应该把它放在课堂上?
遗憾的是,我在课程中找不到任何关于课程属性的内容,所以我很感谢任何建议。
您应该实现一个调用self.sess.close()的close()或__exit__()成员函数。然后像使用Session一样使用对象:
1 2
| with MyClass() as myobj:
... |
编辑(增加详细程度)
关于python的with语句,它的用处以及如何构建兼容的类,有很多资源。它的用途基本上是整齐地处理对象资源的生命周期。
使用上下文管理器(通常使用with语句处理的对象)作为类的成员函数的一种简洁方法是使该类本身成为上下文管理器。
如果您只是在对象的成员函数中打开Session上下文,则此对象(无论如何)的有效生命周期以with块结束:实际上,此会话对象不是类成员但是只是函数的局部变量。如果要在类的多个成员函数中使用相同的Session,则需要将Session资源的生命周期延长到单个函数之外,并让资源由类创建,方法是让它成为上下文管理器。
-
我应该在什么时候调用sess.close()函数?
-
调用MyClass.close()时会调用Session.close(),如果按照上面的习惯用法,将在with范围关闭时调用。 简而言之,不要手动调用它们,而是让范围处理它。
-
对不起,但我还不确定我是否明白你的意思。 当我初始化类的一个实例时,比如instance = MyClass(params)我应该如何在with scope中使用它? 如何在你的范围内自动调用MyClass.close()? 您是否可以在实践中提供显示此构造的链接?
-
在初始化一个成员之后,使用"with instance.session as sess:"是否有意义? 另外,我必须改变课堂上的所有功能,对吗? 现在,如原始帖子所示,一个类返回例如"self.sess.run(self.loss,...)"