【问题标题】:Purpose of using "with tf.Session()"?使用“with tf.Session()”的目的是什么?
【发布时间】:2019-05-21 23:02:03
【问题描述】:

我正在练习名为 concatenate 的 keras 方法。

在这个例子中使用 with 语句让我想到了这个语句的目的

示例代码如下:

import numpy as np 
import keras.backend as K
import tensorflow as tf

t1 = K.variable(np.array([ [[1, 2], [2, 3]], [[4, 4], [5, 3]]]))
t2 = K.variable(np.array([[[7, 4], [8, 4]], [[2, 10], [15, 11]]]))

d0 = K.concatenate([t1 , t2] , axis=-2)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    print(sess.run(d0))

然后我检查来自:tensorflow 的文档 并说:

会话可能拥有资源,例如 tf.Variable、tf.QueueBase 和 tf.ReaderBase。当不再需要这些资源时,释放这些资源很重要。为此,请在会话上调用 tf.Session.close 方法,或将会话用作上下文管理器。

我相信已经解释了所有这一切,但是谁能给我更直观的解释。

提前致谢,祝您有美好的一天!

【问题讨论】:

  • 我不确定还有什么更直观的。关键是,就像打开使用资源的文件一样,您需要记住最后再次关闭它们。通过将您的代码缩进到with 块内,“关闭”部分就为您覆盖了所有内容。一旦你离开那个缩进级别,一切都会自动为你拆除,所有资源都会被释放。
  • 一个荒谬的比喻是离开房间时记得关灯。现在您不必这样做,with 上下文管理器会为您完成 :)
  • @roganjosh 但即使我们离开街区,t1、t2 和 d0 也没有发生任何事情,对吧?

标签: python tensorflow with-statement


【解决方案1】:

张量流documentation 对此非常具体。

由于 tf.Session 拥有物理资源(例如 GPU 和网络连接),它通常用作上下文管理器(在 with 块中),在您退出块时自动关闭会话。

也可以在不使用with 块的情况下创建会话,但您应该在完成后显式调用tf.Session.close 以释放资源。

【讨论】:

    【解决方案2】:

    tf.Session() 启动一个 TensorFlow Graph 对象,其中通过操作(或 ops)处理张量。只要操作完成,with 块就会终止会话。因此,无需致电Session.close。此外,会话包含变量、全局变量、占位符和操作。这些必须在会话创建后启动。因此我们称tf.global_variables_initializer().run()

    图包含张量和操作。要启动图表,需要创建一个运行图表的会话。换句话说,图提供了一个模式,而会话处理一个图来计算值(张量)。

    【讨论】:

    • 谢谢!你为我理解这一点开了个好头,但它仍然让我更深入地思考!所以无论会话是否关闭,变量都不会受到影响,对吧?那么做这件事有什么意义(使用 with 语句)
    • 变量也可以在其他会话中启动。 with 语句自动关闭会话,因此无需调用session.close
    • 那么重点就是跳过 session.close 的一步?和一些资源释放无关?
    • session.close 停用可以再次重新实例化的图形。变量保留在图表中并保持不变。该图可以在另一个 Session 中实例化。
    猜你喜欢
    • 2022-01-16
    • 2018-05-27
    • 2013-07-18
    • 2023-03-17
    • 2018-07-10
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多