我在查看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?
回答:
你需要理解的是,你通过这些操作创建了一个tensorflow图,这意味着它们与numpy函数不同,它们是对这些函数的一种抽象。
你可能已经注意到,你需要创建一个会话,然后通过该会话评估函数才能得到结果,而使用numpy函数时它们是直接执行的。这是由于这个图及其函数定义了要做什么,就像写下一个公式一样,但要为特定的x(或其他任何东西)得到结果,你必须为x插入一个值。这就是你在通过会话和eval所做的事情。
因此,总结一下,你用tensorflow定义了一个图,这是一个函数的更抽象的表示,而且这个图在运行时不会被执行,它被定义后,将在你调用eval函数时执行,并通过该会话运行。
另外请注意,你不能直接混合使用numpy函数和tensorflow函数,但你可以定义自己的tensorflow函数(https://www.tensorflow.org/versions/r0.9/how_tos/adding_an_op/index.html)
顺便说一句,我猜大多数tensorflow函数在底层是使用numpy的。:)