tf.Session()是否属于tf.Graph()的上下文?

时间:2017-07-30 18:29:04

标签: python python-3.x machine-learning tensorflow

我经常在Tensorflow代码中看到以下模式,但通常忽略它们会获得更好的性能。

with tf.Graph().as_default():

    # Build graph here ...
    loss, train_op = ...

    with tf.Session() as sess: # OR: with sv.managed_sess() as sess, etc.

        # Run training steps here ...
        sess.run(train_op)

但我更喜欢先定义我的图形,然后单独运行会话,如下所示(特别是在Jupyter笔记本中)。

在一个区块中:

with tf.Graph().as_default():

    # Build graph here ...
    loss, train_op = ...

在另一个街区:

with tf.Session() as sess: # OR: with sv.managed_sess() as sess, etc.

    # Run training steps here ...
    sess.run(train_op)

我注意到在第一种方法中创建图表需要时间。有时我会使用多个图表,第二种方法是我唯一的选择。为什么一种方法比另一种更好?

2 个答案:

答案 0 :(得分:1)

请勿使用第二个版本。我真的很惊讶它可以像你一样工作。此

import tensorflow as tf

with tf.Graph().as_default():
  x = tf.zeros(())

with tf.Session() as sess:
  sess.run(x)

使用

在张量流1.2.1上失败
RuntimeError: The Session graph is empty.  Add operations to the graph before calling run().

如果您使用的是单个图表,则实际上可以安全地删除with tf.Graph().as_default():行,因为默认情况下已经是默认图表。您不需要创建一个额外的。所以这个

import tensorflow as tf

x = tf.zeros(())

with tf.Session() as sess:
  sess.run(x)

完全合法,在我看来更为可取。

现在,如果您使用的是多个图表......那么,通常情况下,使用单个图表会更好。使用多个图表无法获得任何好处。你应该只在必要时使用它们。

答案 1 :(得分:0)

在常规python脚本中这两种方法没有区别。但是,如果您使用笔记本电脑并分别执行单元格,那么显然不能重新创建图表比从头开始制作图片更快。