哪些代码部分在 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 解释器将完成这项工作。


总结一下:

  1. 在第一部分中,您定义了 TensorFlow 图(由 TensorFlow 编译)。这是所有繁重的微积分应该在的地方。
  2. 第二部分,你运行的代码在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})