Tensorflow - 为什么我们需要张量?

机器算法验证 机器学习 张量流
2022-04-04 19:29:04

为什么我们在 Tensorflow 中需要张量?我的意思是,如果numpy可以用来创建多维数组(本质上是张量),为什么我们还要费心创建张量而不是 numpy 数组呢?

3个回答

深度学习软件定义的张量多维数组,所以如果你只需要对数据进行简单(小规模)的数学运算和转换,那么 TensorFlow 就大材小用了。但 TensorFlow 远不止于此,

  • 它实现了大多数用于构建深度学习模型的常见积木,
  • 它拥有最先进的优化算法,
  • 开箱即用地自动区分,
  • 它支持GPU训练,
  • 它具有高级(Estimator)、中级(Keras)和低级(核心 TensorFlow)接口,具体取决于您是要手动编程,还是只训练通用模型,
  • 开发了概率编程模块
  • 为 TensorFlow 构建 Spark 接口的工作正在进行中,因此它将与大数据环境原生集成,
  • 它可以很容易地集成到生产环境中,
  • 或者模型可以转换为TensorFlow Light并在移动设备上运行,或转换为 JavaScript

它还有很多很多的功能。

我假设 a) 你不会质疑我们为什么拥有 TensorFlow 本身,并理解它的价值;b) 你只质疑为什么 TF 不使用 np.array 类而不是创建一个新类 tf.Tensor。

当您编写任何类型的扩展框架(例如 TensorFlow)时,您最终会创建许多类型甚至类型层次结构。当然,他们中的每一个的创造都可能受到挑战。但是,单独做没有意义。您必须考虑框架的上下文。例如,有时您最终会从已经存在的包中创建几乎完全相同的类副本。为什么不简单地导入包?可能有很多原因,包括您可能不想拖动整个包只是为了从中获取一些类,所以您复制它们等。因此,从软件工程的角度来看,几乎很容易将您的问题丢弃为缺乏上下文。但是,我会尝试回答它,因为它涉及到 TensorFlow 框架的中心数据结构。

有很多方法可以回答这个问题,我只选择一种。看一下 Python 中的以下 numpy 代码:

import numpy as np
np.array([[1,2],[3,4]])**2

这是它产生的输出,一个 2x2 数组的元素平方:

array([[ 1,  4],
       [ 9, 16]], dtype=int32)

接下来看一段看似等价的 TensorFlow 代码:

import tensorflow as tf
t = tf.constant([[1,2],[3,4]])
t = t**2
t

让我们仔细看看它的输出并与 numpy 的比较:

<tf.Tensor 'pow_1:0' shape=(2, 2) dtype=int32>

这不是数组的平方......但是。这个张量与我们上面创建的计算图最终将计算的内容的描述相关联。这是一个非常简单的图,只有几个节点:输入数组和平方运算。尽管如此,它是一个图表。现在让我们对其进行如下评估:

sess = tf.Session()
sess.run(t)

这是输出:

array([[ 1,  4],
       [ 9, 16]], dtype=int32)

现在,这看起来像我们预期的数组!

我们可以使用以下 TF 代码使这一点更加明确:

import tensorflow as tf
import numpy as np

x = tf.placeholder(tf.float32, shape=(2,2))
t = x**2
t

在这里,我们再次获得了张量,它甚至无法急切地计算(感谢@Tim)!

<tf.Tensor 'pow_3:0' shape=(2, 2) dtype=float32>

我们需要插入实际数组而不是占位符以获得如下结果:

sess = tf.Session()
sess.run(t,feed_dict={x: np.array([[1,2],[3,4]])})

获得所需的输出:

array([[  1.,   4.],
       [  9.,  16.]], dtype=float32)

所以,这就是说 TensorFlow 中的 Tensor 类不仅仅是一个 numpy 数组。在这种情况下,它几乎就像一个变量与值的比较。

除了其他答案,我认为 aTensor也可以是一个操作。简而言之,aTensor是数据或操作的抽象,它表示计算图中的一个节点。该图是 TF 为了训练、预测等而要完成的一组计算。