为啥TensorFlow要重新实现很多数学方程?
Posted
技术标签:
【中文标题】为啥TensorFlow要重新实现很多数学方程?【英文标题】:Why does TensorFlow have a lot of mathematical equations re-implemented?为什么TensorFlow要重新实现很多数学方程? 【发布时间】:2016-10-21 00:40:11 【问题描述】:我正在查看TensorFlow 中的 API,并注意到 python 和 numpy 中已经存在的许多数学运算已被重新实现(或至少给出了 tensorflow 接口)。例如:
这样做有充分的理由吗?
我一直在搜索他们的页面,但找不到他们这样做的原因。
不过,我确实有一些猜测。我的一个主要猜测是,他们可能希望这些操作对实现的任何神经网络图都有一些反向传播效果。换句话说,实现它们的衍生物。这是原因之一吗? (希望我知道如何检查我的猜测是否正确)
例如,在线性回归的最基本示例之一中,定义了想要实现的预测函数:
product = tf.matmul(x,W)
y = product + b
而不是
product = tf.matmul(x,W)
y = tf.add(product, b)
不知何故,第一个实现不会干扰随机梯度下降算法进行训练,所以使用 numpy 或 tf.add 进行训练可能并不重要?这是让我感到困惑的一个方面,我什么时候知道应该使用哪一个。
或者他们可能是性能原因?或者,如果需要使用 GPU,是否允许这些操作访问 GPU?
【问题讨论】:
能够在GPU、TPU、android、ios和未来的硬件上运行相同的TF程序 Btw a+b 在您的示例中使用 tf.add,而不是 numpy 【参考方案1】:您必须了解,您使用此操作创建了张量流图,这意味着它们与 numpy 函数不同,它们更像是它们的抽象。
也许您已经注意到您必须创建一个会话,然后通过该会话评估函数以获得结果,其中使用 numpy 函数直接执行它们。这是因为该图及其函数定义了要执行的操作,例如写下公式,但是要获得特定 x(或其他)的结果,您必须为 x 插入一个值。这就是你通过会话和评估所做的。
因此,总而言之,您使用 tensorflow 定义了一个图,它是函数的更抽象表示,并且该图也不会在运行时执行,然后它被定义,它将在您调用 eval 函数时执行并通过运行会话。
另请注意,您不能直接混合使用 numpy 函数和 tensorflow 函数,但可以定义自己的 tensorflow 函数 (https://www.tensorflow.org/versions/r0.9/how_tos/adding_an_op/index.html)
顺便说一句,我猜大多数 tensorflow 函数都在后台使用 numpy。 :)
【讨论】:
好吧,这就是我的怀疑。然而,张量流似乎可以混合两者。你介意澄清一下吗?例如,y = tf.matmul(x,W) + b
。 +
不是张量流操作,但在构建图形时它仍然可以正常工作(我假设)。你介意澄清一下 tf ops 和 np ops 之间的这种混合操作吗?
+ 运算符被重载,这意味着 + 与 tf.add 相同,因为 x、W 和 b 不是数字或 numpy 对象,它们是张量。如果您想了解有关运算符重载的更多信息,只需 google 一下,这很有趣 :)
有道理! :) 我确实知道操作过载,所以我知道你的意思。在 python 中有点生疏,但这解释了很多。如何检查哪些操作正式超载?例如,如果我想做1/x
,我希望它实际上是做tf.div(1,x)
。但是编写 tf.op 会使代码的可读性大大降低,所以我想避免这种情况。
我不知道一个特殊的资源,你可以在其中找到所有重载的运算符,但我猜它们中的大多数是,否则你应该得到一个错误,因为提到你不能混合默认函数/操作使用 tensorflow 操作,所以只需尝试使用它们,你应该没问题!
是的,tensorflow 为我们完成了所有繁琐的工作,这意味着您不必派生任何东西。 :D以上是关于为啥TensorFlow要重新实现很多数学方程?的主要内容,如果未能解决你的问题,请参考以下文章
TensorFlow:如何以及为啥要使用 SavedModel
为啥在同一数据集上使用 tensorflow 和 keras 重新训练的 Inception V3 显示出不同的准确性?