本文主要介绍张量的基本概念以及在TensorFlow vs PyTorch中的具体实现。
什么是张量(Tensor)?
- 用于机器学习/深度学习模型的一种数据结构,用TensorFlow、PyTorch、Paddle等框架构建的深度学习模型都使用张量来实现模型输入、模型输出和数据处理
- 张量表示多维数据或矩阵,类似numpy中的N维数据对象numpy.ndarray,很多操作跟numpy.ndarray类似,但比ndarray多了许多功能和属性
- 张量支持自动微分操作,也支持在GPU上计算,这两个功能是与numpy.ndarray对象最大的不同。
第一:张量是否与Numpy array共享相同的底层内存?
PyTorch的Tensor与NumPy array共享相同的底层内存,极大减少了Numpy与PyTorch之间的数据拷贝操作。参考Bridge With Numpy。需要注意的是,无论是从Numpy还是PyTorch侧改变了数据,共享内存的另一个也会自动改变数据,如下所示:
tensor与ndarray共享内存
TensorFlow的Tensor与NumPy array不共享相同的底层内存,因为tf.Tensor是不可变immutable对象
tf.Tensor与Numpy.ndarray不共享内存
第二:张量的实现种类?
PyTorch就一种Tensor实现方式,即torch.Tensor
TensorFlow有好几种:矩阵形状的tf.constant、tf.Tensor vs tf.Variable;非矩阵形状的:tf.RaggedTensor,tf.sparse.SparseTensor。
第三:张量的属性?
PyTorch的张量属性如下: torch.Tensor
都有 torch.dtype
, torch.device
, torch.layout
和torch.memory_format
TensorFlow的张量属性如下图所示:
tf.Tensor的属性列表
第四:张量的基本操作——创建张量
-
在Python对象上创建,例如:列表, TensorFlow版本如下所示:
TensorFlow版本PyTorch版本 -
在Numpy.ndarray对象上创建,TensorFlow版本如下所示,tf.convert_to_tensor()函数可以将tf.Tensor, numpy.ndarray, Python List和Python scalar类型转换为EagerTensor:
TensorFlow版本
PyTorch版本如下所示:PyTorch版本
结论:
- TensorFlow有沉重的继承于v1.x的历史负担,所以张量实现比较让用户感觉“混乱”,实现一个功能,有多种方式或函数。
- 从自动微分的角度,在TensorFlow中,支持自动微分的是tf.Variable,因为梯度带(GradientTape)会自动监视
tf.Variable
,但不会监视tf.Tensor
。一个常见错误是无意中将tf.Variable
替换为tf.Tensor
,而不使用Variable.assign
更新tf.Variable
-
TensorFlow 与 PyTorch中的张量实现不能对应,说实话,个人更喜欢PyTorch中简洁的实现,用户不会如何迷惑。TensorFlow 与 PyTorch中的张量实现不能对应