Fork me on GitHub

Java工程师如何理解张量?

刚接触 AI 和 PyTorch,理解 “张量 (Tensor)” 是入门关键。

简单来说,可将 PyTorch 中的张量 (Tensor) 理解为 Java 中的多维数组,但它比普通的 Java 数组强大得多,尤其在 AI 和深度学习领域。

1 张量(Tensor) VS Java 数组/列表

  • Java 数组 (Array) / 列表 (List): Java常用数组和列表来存储数据,例如 int[], double[][], List<String>, ArrayList<Integer> 等。 它们可以存储一系列相同类型的数据。

  • PyTorch 张量 (Tensor):

    张量本质上也是用来存储数值数据的,就像 Java 的数组一样,它可以是:

    • 标量 (Scalar): 一个单独的数字,类似于 Java 中的 int, float, double 等基本数据类型。 例如: 5, 3.14, -10

    • 向量 (Vector): 一维数组,类似于 Java 中的 int[]List<Integer>。 例如: [1, 2, 3], [2.5, 3.5, 4.0]

    • 矩阵 (Matrix):

      二维数组,类似于 Java 中的

      int[][]
      

      List<List<Integer>>
      

      如:

      [[1, 2],
       [3, 4]]
      
    • 更高维度的数组: 张量可以是三维、四维甚至更高维度的数组,这在深度学习中非常常见,用来表示更复杂的数据结构。

核心区别和优势

特性 Java 数组/列表 (Array/List) PyTorch 张量 (Tensor)
数据类型 基本数据类型, 对象引用 数值类型 (浮点数, 整数等)
运算性能 CPU 运算为主 GPU 加速运算!
功能 数据存储为主 数据存储 + 高效运算 + 自动求导
动态性 数组大小固定 (Array),列表大小可变 (List) 张量形状可以灵活变换 (通过 view())
底层实现 Java 虚拟机 C++/CUDA (针对 GPU 优化)

2 “张量” 的专业解释

张量是多维数组的泛化。 它是一个可以表示标量、向量、矩阵以及更高维度数据的数学对象。 在 PyTorch 中,张量是其核心数据结构,用于表示神经网络的输入、输出和参数。

3 张量的维度(Dimensions/Rank)

张量的维度也称为轴 (axis) 或秩 (rank)。 它决定了张量可以表示的数据的结构。

  • 0 维张量 (标量):

    只有一个数值,维度为 0。

    scalar_tensor = torch.tensor(5)
    print(scalar_tensor.ndim)  # 输出维度: 0
    
  • 1 维张量 (向量):

    一列或一行数值,维度为 1。

    vector_tensor = torch.tensor([1, 2, 3])
    print(vector_tensor.ndim)  # 输出维度: 1
    print(vector_tensor.shape) # 输出形状: torch.Size([3])
    
  • 2 维张量 (矩阵):

    行和列组成的表格,维度为 2。

    matrix_tensor = torch.tensor([[1, 2], [3, 4]])
    print(matrix_tensor.ndim)  # 输出维度: 2
    print(matrix_tensor.shape) # 输出形状: torch.Size([2, 2])
    
  • 3 维张量 (立方体):

    可以想象成多个矩阵堆叠在一起,维度为 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])
    

4 张量的数据类型(Data Types)

就像 Java 中有 int, float, double 等数据类型一样,PyTorch 张量也有不同的数据类型,如:

  • torch.float32torch.float: 32 位浮点数 (单精度浮点数),常用。
  • torch.float64torch.double: 64 位浮点数 (双精度浮点数),精度更高,但更耗内存和计算资源。
  • torch.float16torch.half: 16 位浮点数 (半精度浮点数),更节省内存和加速计算,但精度较低。
  • torch.int32torch.int: 32 位整数。
  • torch.int64torch.long: 64 位整数 (长整型),常用表示索引等。
  • torch.uint8: 8 位无符号整数 (0-255),常用于图像像素表示。
  • 等等...

代码示例中看到的 dtype=torch.long, dtype=torch.double, dtype=torch.float 就是指定张量的数据类型。 选择合适的数据类型对于性能和精度至关重要。

5 GPU 加速(GPU Acceleration)

这是 PyTorch 张量最核心的优势! 普通的 Java 数组和列表主要在 CPU 上进行运算,而 PyTorch 张量可以轻松地转移到 GPU 上进行加速运算。

GPU (图形处理器) 特别擅长并行计算,而神经网络的训练和推理包含大量的矩阵运算,非常适合 GPU 并行加速。 使用 GPU 可以大幅度提升深度学习模型的训练和推理速度。

代码示例中看到的 .to(device) 方法和 torch.device("cuda") 就是用来将张量转移到 GPU 上的。

6 张量在深度学习中的应用

在深度学习中,张量几乎无处不在:

  • 神经网络的权重 (Weights) 和偏置 (Biases): 模型的参数通常用张量表示。
  • 输入数据 (Images, Text, Audio 等): 输入数据被转换成张量喂给神经网络。例如,图像可以表示为 3 维张量 (高度 x 宽度 x 颜色通道)。
  • 神经网络的中间层输出 (Activations): 每一层神经网络的输出也是张量。
  • 梯度 (Gradients): 在反向传播过程中计算的梯度也是张量,用于更新模型的参数。

7 总结

  • 把 PyTorch 张量理解为 “GPU 加速的,功能更强大的多维数组” 是一个很好的入门方式。
  • 张量是 PyTorch 的核心数据结构,用于存储数值数据并进行高效的数学运算,尤其擅长 GPU 加速的矩阵运算。
  • 理解张量的维度、数据类型和 GPU 加速特性,是学习 PyTorch 和深度学习的基础。
  • 作为 Java 工程师,可将张量类比为 Java 中的数组/列表,但要记住张量在 AI 领域的独特价值和优势。

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W+技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统亿级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

本文由博客一文多发平台 OpenWrite 发布!

posted @   公众号-JavaEdge  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 开源的 DeepSeek-R1「GitHub 热点速览」
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
点击右上角即可分享
微信分享提示