PyTorch张量
相关基础知识
张量的基本概念
定义:
张量(tensor)是矩阵向任意维度的推广。张量的维度(dimension)通常叫作轴(axis),张量轴的个数也叫作阶(rank)。
概念核心:
张量是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。
应用:
机器学习的数据存储在张量中。一般来说,当前所有机器学习系统都使用张量作为基本数据结构。
张量的关键属性
- 阶:张量的轴的个数。
- 形状:张量沿每个轴的维度大小(元素个数)。在Python中一般用整数元组表示。标量的形状为空元组。
- 数据类型(在Python库中通常叫作dtype):张量中所包含数据的类型。
张量的分类
- 标量(0D 张量):仅包含一个数字的张量叫作标量(scalar)。标量也叫标量张量、零维张量、0D 张量。标量张量有 0 个轴。
- 向量(1D 张量):数字组成的数组叫作向量(vector)或一维张量(1D 张量)。一维张量只有一个轴。
- 矩阵(2D 张量):向量组成的数组叫作矩阵(matrix)或二维张量(2D 张量)。矩阵有 2 个轴(通常叫作行和列)。你可以将矩阵直观地理解为数字组成的矩形网格。第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column)。
- 3D 张量与更高维张量:将多个矩阵组合成一个新的数组,可以得到一个 3D 张量,你可以将其直观地理解为数字组成的立方体。
易错点提醒:
维度(dimensionality)可以表示沿着某个轴上的元素个数(比如 5D 向量),也可以表示张量中轴的个数(比如 5D 张量),这有时会令人感到混乱。
向量有 5 个元素就被称为 5D 向量。不要把 5D 向量和 5D 张量弄混!对于后一种情况,技术上更准确的说法是 5 阶张量(张量的阶数即轴的个数),但 5D 张量这种模糊的写法更常见。
张量的运算
深度神经网络学到的所有变换也都可以简化为数值数据张量上的一些张量运算(tensor operation),例如加上张量、乘以张量等。
你可以将神经网络解释为高维空间中非常复杂的几何变换,这种变换可以通过许多简单的步骤来实现。换句话说就是为复杂的、高度折叠的数据流形找到简洁的表示。这与人类展开纸球所采取的策略大致相同。深度网络的每一层都通过变换使数据解开一点点——许多层堆叠在一起,可以实现非常复杂的解开过程。
逐元素运算(element-wise)
特点:这些运算独立地应用于张量中的每个元素。
例子:relu 运算和加法。
特性:这些运算非常适合大规模并行实现(向量化实现,这一术语来自于 1970—1990 年间向量处理器超级计算机架构)。
广播(broadcast)
应用场景:将两个形状不同的张量相加时,较小的张量会被广播,以匹配较大张量的形状。
步骤
- 向较小的张量添加轴(叫作广播轴),使其 ndim 与较大的张量相同。
- 将较小的张量沿着新轴重复,使其形状与较大的张量相同。
注意事项:在实际的实现过程中并不会创建新的 2D 张量,因为那样做非常低效。重复的操作完全是虚拟的,它只出现在算法中,而没有发生在内存中。
张量积(tensor product)
向量间的点积
两个向量之间的点积是一个标量,而且只有元素个数相同的向量之间才能做点积。
以下代码展示了向量点积运算的步骤,假设x,y均是numpy数组。
def