Java工程师如何理解张量?

本文涉及的产品
视觉智能开放平台,视频资源包5000点
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: 刚接触AI和PyTorch,理解“张量(Tensor)”是入门关键。张量可类比为Java中的多维数组,但更强大,尤其在AI领域支持GPU加速、自动求导等特性。它不仅能高效存储数据,还能进行复杂运算,是深度学习的核心数据结构。掌握张量的维度、数据类型及GPU加速特性,对学习PyTorch至关重要。

刚接触 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应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
10月前
|
监控 网络协议 Java
《Java工程师成神之路》阿里技术专家之作,囊括Java所有知识点!
很多Java程序员一直希望找到一份完整的学习路径,但是市面上很多书都是专注某一个领域的,没有一份完整的大图,以至于很多程序员很迷茫,不知道自己到底应该从哪里开始学,或者不知道自己学习些什么。
|
10月前
|
消息中间件 Java 应用服务中间件
|
6月前
|
架构师 前端开发 Java
Java开发工程师的职业规划应该是什么样的?
Java开发工程师的职业规划涵盖多个阶段,包括初入行业(0-1年)、技能提升(1-3年)、技术专家(3-5年)及管理或专家路线选择(5年以上)。各阶段设定了明确的技能要求与职业目标,从掌握Java基础、常用框架到深入研究高级技术、微服务架构乃至担任管理职务或成为技术专家。通过持续学习与实践,结合个人兴趣,Java工程师可在技术或管理领域找到合适的发展方向,最终实现职业成功。
742 83
|
6月前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
124 19
|
6月前
|
人工智能 前端开发 Java
Java开发工程师转哪个行业比较好?
Java开发工程师转哪个行业比较好?
446 2
|
7月前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
10月前
|
Java
电子书阅读分享《Java工程师成神之路》
电子书阅读分享《Java工程师成神之路》
|
6月前
|
小程序 前端开发 JavaScript
Java开发工程师转小程序开发的前景如何?
Java开发工程师转小程序开发的前景如何?
85 0
|
10月前
|
设计模式 架构师 Java
2024到来!一到五年Java工程师想跳槽,大环境不好,怎么破?
会不会因为裁员潮,市场上工作机会比往年跳槽季更少,同时求职者因为失业或裁员潮带来的恐慌心理,很多人在找工作时更怕错过机会而不做过多思考和选择就入职。这样的形势下跳槽或者求职时,该如何判断和做出选择?
|
8月前
|
Java
图解java工程师学习路线
图解java工程师学习路线
296 0