我经常在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)
我注意到在第一种方法中创建图表需要时间。有时我会使用多个图表,第二种方法是我唯一的选择。为什么一种方法比另一种更好?
答案 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脚本中这两种方法没有区别。但是,如果您使用笔记本电脑并分别执行单元格,那么显然不能重新创建图表比从头开始制作图片更快。