刚接触 AI 和 PyTorch,理解 “张量 (Tensor)” 是入门关键。
可将 PyTorch 中的张量理解为 Java 的多维数组,但它比普通的 Java 数组强大得多,尤其在 AI 和深度学习领域。
Java常用数组和列表来存储数据,如 int[], double[][], List<String>, ArrayList<Integer> 等。存储一系列相同类型的数据。
PyTorch的张量本质也是存储数值数据,就像Java数组一样,它可以是:
-
标量(Scalar):一个单独的数字,类似Java的
int,float,double等基本数据类型。 -
向量(Vector):一维数组,类似Java的
int[]或List<Integer>。 如:[1, 2, 3],[2.5, 3.5, 4.0] -
矩阵(Matrix):二维数组,类似Java的
int[][]或List<List<Integer>> -
更高维度的数组:张量可以是三维、四维甚至更高维数组,这在深度学习很常见,用来表示更复杂的数据结构
| 特性 | Java 数组/列表 (Array/List) | PyTorch 张量 (Tensor) |
|---|---|---|
| 数据类型 | 基本数据类型, 对象引用 | 数值类型 (浮点数, 整数等) |
| 运算性能 | CPU 运算为主 | GPU 加速运算! |
| 功能 | 数据存储为主 | 数据存储 + 高效运算 + 自动求导 |
| 动态性 | 数组大小固定 (Array),列表大小可变 (List) | 张量形状可灵活变换 (通过 view()) |
| 底层实现 | Java 虚拟机 | C++/CUDA (针对 GPU 优化) |
张量是多维数组的泛化。 它是一个可表示标量、向量、矩阵及更高维度数据的数学对象。
PyTorch 中,张量是其核心数据结构,表示神经网络的输入、输出和参数。
张量的维度也称轴 (axis) 或秩 (rank)。其决定张量可表示的数据的结构。
只有一个数值,维度为0。
scalar_tensor = torch.tensor(5)
print(scalar_tensor.ndim) # 输出维度: 0一列或一行数值,维度为1。
vector_tensor = torch.tensor([1, 2, 3])
print(vector_tensor.ndim) # 输出维度: 1
print(vector_tensor.shape) # 输出形状: torch.Size([3])行和列组成的表格,维度为2。
matrix_tensor = torch.tensor([[1, 2], [3, 4]])
print(matrix_tensor.ndim) # 输出维度: 2
print(matrix_tensor.shape) # 输出形状: torch.Size([2, 2])可以想象成多个矩阵堆叠在一起,维度为 3。 在图像处理中,彩色图像可用3维张量表示 (高度 x 宽度 x 颜色通道):
tensor_3d = torch.randn(3, 4, 5) # 3个矩阵,每个矩阵 4行 5列
print(tensor_3d.ndim) # 输出维度: 3
print(tensor_3d.shape) # 输出形状: torch.Size([3, 4, 5])就像 Java 中有 int, float, double 等数据类型一样,PyTorch 张量也有不同的数据类型,如:
torch.float32或torch.float: 32 位浮点数 (单精度浮点数),常用。torch.float64或torch.double: 64 位浮点数 (双精度浮点数),精度更高,但更耗内存和计算资源。torch.float16或torch.half: 16 位浮点数 (半精度浮点数),更节省内存和加速计算,但精度较低。torch.int32或torch.int: 32 位整数。torch.int64或torch.long: 64 位整数 (长整型),常用表示索引等。torch.uint8: 8 位无符号整数 (0-255),常用于图像像素表示。- 等等...
代码示例中看到的 dtype=torch.long, dtype=torch.double, dtype=torch.float 就是指定张量的数据类型。 选择合适的数据类型对于性能和精度至关重要。
这是 PyTorch 张量最核心的优势! 普通的 Java 数组和列表主要在 CPU 上进行运算,而 PyTorch 张量可以轻松地转移到 GPU 上进行加速运算。
GPU (图形处理器) 特别擅长并行计算,而神经网络的训练和推理包含大量的矩阵运算,非常适合 GPU 并行加速。 使用 GPU 可以大幅度提升深度学习模型的训练和推理速度。
代码示例中看到的 .to(device) 方法和 torch.device("cuda") 就是用来将张量转移到 GPU 上的。
在深度学习中,张量几乎无处不在:
- 神经网络的权重 (Weights) 和偏置 (Biases): 模型的参数通常用张量表示。
- 输入数据 (Images, Text, Audio 等): 输入数据被转换成张量喂给神经网络。例如,图像可以表示为 3 维张量 (高度 x 宽度 x 颜色通道)。
- 神经网络的中间层输出 (Activations): 每一层神经网络的输出也是张量。
- 梯度 (Gradients):在反向传播过程中计算的梯度也是张量,用于更新模型的参数。
- 把 PyTorch 张量理解为 “GPU 加速的,功能更强大的多维数组” 是一个很好的入门方式。
- 张量是 PyTorch 的核心数据结构,用于存储数值数据并进行高效的数学运算,尤其擅长 GPU 加速的矩阵运算。
- 理解张量的维度、数据类型和 GPU 加速特性,是学习 PyTorch 和深度学习的基础。
- 作为 Java 工程师,可将张量类比为 Java 中的数组/列表,但要记住张量在 AI 领域的独特价值和优势。