哪些代码部分在 Tensorflow 与 Python 解释器中执行?
Which portions of code execute in Tensorflow vs. Python interpreter?
在 Tensorflow 中,我们通常有一个代码块来设置计算图,第二个代码块用于 运行 会话,例如:
graph = tf.Graph()
with graph.as_default():
...Computation graph code here...
...
with tf.Session(graph=graph) as session:
... code to run the graph here...
...
在这两个块中,什么规则决定代码是在 Tensorflow(尤其是 GPU)的黑暗和神秘世界中执行还是在 Python 解释器中执行?我的假设是,只有那些以 tf.
开头的函数在 Tensorflow 宇宙中执行,其他一切都由 Python 处理?因此,如果我在 "graph" 块或 "session" 块中添加一些 Python 代码,那么它将无法通过 Tensorflow 的编译代码和 GPU 库获得速度优势,这可以放慢速度,对吗?
2016.6.5更新:
示例:假设我想创建一个不同于 Tensorflow 提供的损失函数。我已经在 with graph.as_default():
块内使用以下行以较小的方式完成了此操作。此代码使用 L2 正则化计算损失:
loss = tf.reduce_mean (tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))
L2loss = L2weight * (tf.nn.l2_loss(weightsLayer2) + tf.nn.l2_loss(weightsLayer1))
loss = loss + L2loss
第一行纯 Tensorflow。后两行是 Tensorflow + python。 python 部分可以是任意复杂的。我可以理解所有的tf
函数都是在Tensorflow内部执行的,但是在上面的第2行和第3行中,加法和乘法是否也由Tensorflow执行,或者它们是由Tensorflow的"jumping out"执行到Python 解释器,然后返回到 Tensorflow?如果是这样,这是否会导致性能损失?我是否应该在 session
块中进行加法和乘法运算,然后通过提要字典将结果返回给 Tensorflow(这也会涉及性能损失)?优化器需要在 graph
块内进行最终损失。
据我了解 TensorFlow,您定义图形的第一部分应该只用 TensorFlow 函数编写。如果你想添加一些 python 它应该与图表分开并通过占位符添加(tf.placeholder
)。
另一方面,在 tf.Session()
部分,您将通过 sess.run()
调用图形结果,提供 feed_dict
值(python 对象,主要是数组).然后,您获得的结果将是 python 个对象,因此这里 Python 解释器将完成这项工作。
总结一下:
- 在第一部分中,您定义了 TensorFlow 图(由 TensorFlow 编译)。这是所有繁重的微积分应该在的地方。
- 第二部分,你运行的代码在Python但是通过
sess.run()
调用了TensorFlow graph,也就是TensorFlow运行(并且应该包含大部分微积分)
更新
要回答您更新后的问题,您应该尽可能使用 TensorFlow 函数进行所有计算(因为它会快得多)。现在,如果您需要进行一些在 TensorFlow 中不可能进行的计算,唯一的方法是调用 sess.run()
并使用占位符将值反馈到图中。
这是不得已的情况,因为与 TensorFlow 实施相比它会非常慢!
loss = tf.constant(0.5) # in the TensorFlow graph
# Now you want to do some computations in Python, and obtain the value loss_bis
loss_bis = tf.placeholder(tf.float32, [])
res = ... # the TensorFlow graph continues
with tf.Session() as sess:
loss_value = sess.run(loss)
# PYTHON COMPUTATIONS
loss_bis_value = something_complicated_and_impossible_in_tf(loss_value)
sess.run([...], feed_dict={loss_bis=loss_bis_value})
在 Tensorflow 中,我们通常有一个代码块来设置计算图,第二个代码块用于 运行 会话,例如:
graph = tf.Graph()
with graph.as_default():
...Computation graph code here...
...
with tf.Session(graph=graph) as session:
... code to run the graph here...
...
在这两个块中,什么规则决定代码是在 Tensorflow(尤其是 GPU)的黑暗和神秘世界中执行还是在 Python 解释器中执行?我的假设是,只有那些以 tf.
开头的函数在 Tensorflow 宇宙中执行,其他一切都由 Python 处理?因此,如果我在 "graph" 块或 "session" 块中添加一些 Python 代码,那么它将无法通过 Tensorflow 的编译代码和 GPU 库获得速度优势,这可以放慢速度,对吗?
2016.6.5更新:
示例:假设我想创建一个不同于 Tensorflow 提供的损失函数。我已经在 with graph.as_default():
块内使用以下行以较小的方式完成了此操作。此代码使用 L2 正则化计算损失:
loss = tf.reduce_mean (tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))
L2loss = L2weight * (tf.nn.l2_loss(weightsLayer2) + tf.nn.l2_loss(weightsLayer1))
loss = loss + L2loss
第一行纯 Tensorflow。后两行是 Tensorflow + python。 python 部分可以是任意复杂的。我可以理解所有的tf
函数都是在Tensorflow内部执行的,但是在上面的第2行和第3行中,加法和乘法是否也由Tensorflow执行,或者它们是由Tensorflow的"jumping out"执行到Python 解释器,然后返回到 Tensorflow?如果是这样,这是否会导致性能损失?我是否应该在 session
块中进行加法和乘法运算,然后通过提要字典将结果返回给 Tensorflow(这也会涉及性能损失)?优化器需要在 graph
块内进行最终损失。
据我了解 TensorFlow,您定义图形的第一部分应该只用 TensorFlow 函数编写。如果你想添加一些 python 它应该与图表分开并通过占位符添加(tf.placeholder
)。
另一方面,在 tf.Session()
部分,您将通过 sess.run()
调用图形结果,提供 feed_dict
值(python 对象,主要是数组).然后,您获得的结果将是 python 个对象,因此这里 Python 解释器将完成这项工作。
总结一下:
- 在第一部分中,您定义了 TensorFlow 图(由 TensorFlow 编译)。这是所有繁重的微积分应该在的地方。
- 第二部分,你运行的代码在Python但是通过
sess.run()
调用了TensorFlow graph,也就是TensorFlow运行(并且应该包含大部分微积分)
更新
要回答您更新后的问题,您应该尽可能使用 TensorFlow 函数进行所有计算(因为它会快得多)。现在,如果您需要进行一些在 TensorFlow 中不可能进行的计算,唯一的方法是调用 sess.run()
并使用占位符将值反馈到图中。
这是不得已的情况,因为与 TensorFlow 实施相比它会非常慢!
loss = tf.constant(0.5) # in the TensorFlow graph
# Now you want to do some computations in Python, and obtain the value loss_bis
loss_bis = tf.placeholder(tf.float32, [])
res = ... # the TensorFlow graph continues
with tf.Session() as sess:
loss_value = sess.run(loss)
# PYTHON COMPUTATIONS
loss_bis_value = something_complicated_and_impossible_in_tf(loss_value)
sess.run([...], feed_dict={loss_bis=loss_bis_value})