【问题标题】:Why are tensorflow sessions and graph so difficult to understand?为什么 tensorflow 会话和图形如此难以理解?
【发布时间】:2020-03-23 17:09:38
【问题描述】:

我是 tensorflow 新手,需要使用一些遗留代码来完成一个项目。我以前用过 PyTorch。我觉得理解 TensorFlow 太难了。我用的是1.14.0版本。
1. 我使用 Jupyter Notebook。当我创建一些操作时,有时我需要多次调试同一个单元格。然后我发现我的图表很奇怪。当我运行这些在图中多次创建一些操作的单元时发生了什么?它使我对图表和会话感到困惑。根据我目前的理解,我需要构建一个静态图来运行代码。那么会话的目的是什么?当我在 Jupyter 中发现错误并编辑运行的代码时,是否需要重置图形和会话?
2. 调试是一场灾难。当维度出现问题时。 Tensorflow 有一些长期的抱怨,但从来没有告诉我为什么会出错。我需要仔细查看以找出错误。
3. API似乎发生了很大的变化。我总是收到一些警告,这些接口已降级。
4. 打印东西很难。我需要致电sess.run 来获取列表。或者在图中添加tf.summary op 运行并在tensorboard中查看。

我正在处理那些旧代码。使用 Tensorflow 的正确方法是什么?我喜欢 PyTorch 带来的说服力。我可以设置一些断点并轻松打印我需要的任何内容。我想用 Tensorflow 做同样的事情。调试 TensorFlow 浪费了我很多时间。只有我刷新图表并打开张量板的工具才能看到我的计算图,这是真的吗?这真的很不方便。

【问题讨论】:

    标签: tensorflow deep-learning


    【解决方案1】:

    TLDR:尽管 TensorFlow 的早期版本很难使用,但 TensorFlow 2.0 的性能要好得多,并且已经转向具有 AutoGraph 等功能的更动态的图。所以不要气馁使用 TensorFlow。

    1. 我使用 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_atf_b 提供值以成功评估tf_c 并检查是否提供了这些值并继续执行图表并获取tf_c

    如果你想重新运行你的代码而不破坏你的计算图,你应该在单元格的开头使用tf.reset_defualt_graph()。这将清理图表。否则,您将不断向图表中添加项目,甚至会出现错误(例如,尝试创建两次同名的变量)。

    话虽如此,TensorFlow 2.0 要好得多。 TensorFlow 2.0 摆脱了会话的概念,并立即执行您所称的事情。

    1. 调试是一场灾难。当维度出现问题时。 Tensorflow 有一些长期的抱怨,但从来没有告诉我为什么会出错。我需要仔细查看以找出错误。

    这里不能多说。但是当你习惯它时,它会变得更容易(至少这是我的个人经验)。

    但是,在 TensorFlow 2.0 中,您可以使用首选调试器进行实时调试,因为操作和张量在调用时会立即执行。

    1. API 似乎发生了很大变化。我总是收到一些警告,这些接口已降级。

    是的,TensorFlow 正在迅速发展。这些年来确实经历了一些重大的设计变化。

    1. 很难打印。我需要调用 sess.run 来获取列表。或者在图中添加 tf.summary op 运行,在 tensorboard 中查看。

    这就是 TensorFlow 的设计方式。原因是拥有静态图比动态构建图需要更少的复杂性。如果图形是动态构建的,它必须解析 Python 语法(例如 For 循环/while 循环/if else 条件)来推断数据流。最重要的是,请确保图表不会过大(例如扩展 for 循环)。

    我确信也存在性能差异。但我还没有测试过,也没有足够的能力来详细说明。

    这是我对您的问题的看法。希望它能解决问题。

    【讨论】:

    • 感谢您的出色回答。它确实把事情弄清楚了。我想这也解释了为什么 PyTorch 在顶级 AI 会议中更受欢迎。
    猜你喜欢
    • 2017-11-02
    • 2010-11-30
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多