TLDR:尽管 TensorFlow 的早期版本很难使用,但 TensorFlow 2.0 的性能要好得多,并且已经转向具有 AutoGraph 等功能的更动态的图。所以不要气馁使用 TensorFlow。
- 我使用 Jupyter Notebook。当我创建一些操作时,有时我需要多次调试同一个单元格。然后我发现我的图表很奇怪。当我运行这些在图中多次创建一些操作的单元时发生了什么?它使我对图表和会话感到困惑。根据我目前的理解,我需要构建一个静态图来运行代码。那么会话的目的是什么?当我在 Jupyter 中发现错误并编辑运行的代码时,是否需要重置图表和会话?
Graph 是您构建的计算图。 TensorFlow 使用 GraphDef 格式来表示图。基本上当你写作时,
tf_a = tf.placeholder(dtype=tf.float32)
tf_b = tf.placeholder(dtype=tf.float32)
tf_c = tf_a + (2.0 * tf_b)
TensorFlow 在后台构建以下图表。
tf_a tf_b tf_constant(2)
\ \ /
\ tf.mul
\ /
tf.add
|
tf_c
它只是坐在那里,不执行任何操作。这就是为什么如果你尝试运行 print(tf_c) 你什么都看不到的原因。
会话进入,查看图表并执行该图表的点点滴滴。例如,当您说sess.run(tf_c, feed_dict={tf_a:2.0, tf_b: 3.0})。会话管理器将查看图表,了解您需要向tf_a 和tf_b 提供值以成功评估tf_c 并检查是否提供了这些值并继续执行图表并获取tf_c。
如果你想重新运行你的代码而不破坏你的计算图,你应该在单元格的开头使用tf.reset_defualt_graph()。这将清理图表。否则,您将不断向图表中添加项目,甚至会出现错误(例如,尝试创建两次同名的变量)。
话虽如此,TensorFlow 2.0 要好得多。 TensorFlow 2.0 摆脱了会话的概念,并立即执行您所称的事情。
- 调试是一场灾难。当维度出现问题时。 Tensorflow 有一些长期的抱怨,但从来没有告诉我为什么会出错。我需要仔细查看以找出错误。
这里不能多说。但是当你习惯它时,它会变得更容易(至少这是我的个人经验)。
但是,在 TensorFlow 2.0 中,您可以使用首选调试器进行实时调试,因为操作和张量在调用时会立即执行。
- API 似乎发生了很大变化。我总是收到一些警告,这些接口已降级。
是的,TensorFlow 正在迅速发展。这些年来确实经历了一些重大的设计变化。
- 很难打印。我需要调用 sess.run 来获取列表。或者在图中添加 tf.summary op 运行,在 tensorboard 中查看。
这就是 TensorFlow 的设计方式。原因是拥有静态图比动态构建图需要更少的复杂性。如果图形是动态构建的,它必须解析 Python 语法(例如 For 循环/while 循环/if else 条件)来推断数据流。最重要的是,请确保图表不会过大(例如扩展 for 循环)。
我确信也存在性能差异。但我还没有测试过,也没有足够的能力来详细说明。
这是我对您的问题的看法。希望它能解决问题。