TensorFlow vs PyTorch 2: 张量(Tensor)

本文主要介绍张量的基本概念以及在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.RaggedTensortf.sparse.SparseTensor

第三:张量的属性?
PyTorch张量属性如下: torch.Tensor 都有 torch.dtype, torch.device, torch.layouttorch.memory_format
TensorFlow张量属性如下图所示:

tf.Tensor的属性列表

第四:张量的基本操作——创建张量

  1. 在Python对象上创建,例如:列表, TensorFlow版本如下所示:

    TensorFlow版本
    PyTorch版本如下所示:
    PyTorch版本

  2. 在Numpy.ndarray对象上创建,TensorFlow版本如下所示,tf.convert_to_tensor()函数可以将tf.Tensor, numpy.ndarray, Python List和Python scalar类型转换为EagerTensor:

    TensorFlow版本

    PyTorch版本如下所示:
    PyTorch版本

结论

  1. TensorFlow有沉重的继承于v1.x的历史负担,所以张量实现比较让用户感觉“混乱”,实现一个功能,有多种方式或函数。
  2. 从自动微分的角度,在TensorFlow中,支持自动微分的是tf.Variable,因为梯度带(GradientTape)会自动监视 tf.Variable,但不会监视 tf.Tensor。一个常见错误是无意中将 tf.Variable 替换为 tf.Tensor,而不使用 Variable.assign 更新 tf.Variable
  3. TensorFlow 与 PyTorch中的张量实现不能对应,说实话,个人更喜欢PyTorch中简洁的实现,用户不会如何迷惑。
    TensorFlow 与 PyTorch中的张量实现不能对应
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容