Torch核心数据结构Tensor(张量)

发布时间:2026/7/27 2:55:34

Torch核心数据结构Tensor(张量)
Torch核心数据结构Tensor张量在深度学习和科学计算领域PyTorch 凭借其动态计算图和易用性成为了最受欢迎的框架之一。而这一切的基石便是其核心数据结构——Tensor张量。Tensor 可以理解为多维数组的泛化它不仅是存储数据的容器更是连接 CPU、GPU 计算以及自动微分Autograd的桥梁。本文将从原理层面深入剖析 Tensor并提供可运行的代码示例帮助读者理解其精髓。## Tensor 的基本概念与内存布局Tensor 本质上是一个多维数组但与传统数组不同它拥有更丰富的语义。从数学角度看标量0维张量、向量1维张量、矩阵2维张量都是张量的特例。在 PyTorch 中Tensor 包含两个核心部分-数据区存储在连续内存块中的数值支持整数、浮点数等类型。-元数据包括形状shape、步长stride、数据类型dtype和设备device如 CPU/GPU。步长stride是理解 Tensor 内存布局的关键。它表示在每个维度上从当前元素移动到下一个元素需要跳过的内存单元数量。例如一个形状为(3, 4)的矩阵默认的步长为(4, 1)即行间移动需跳过 4 个元素列间移动只需 1 个元素。PyTorch 通过步长实现了视图view操作在不复制数据的情况下重塑张量极大节省了内存。## Tensor 的创建与基本操作我们从一个简单的代码示例开始演示如何创建 Tensor 并观察其属性。pythonimport torch# 创建一个形状为 (2, 3) 的浮点型张量元素值随机tensor_a torch.randn(2, 3) # 标准正态分布随机数print(Tensor a:\n, tensor_a)print(形状:, tensor_a.shape)print(数据类型:, tensor_a.dtype)print(设备:, tensor_a.device)print(步长:, tensor_a.stride()) # 输出 (3, 1)表示行步长3列步长1# 创建全零张量并指定数据类型和设备if torch.cuda.is_available(): tensor_b torch.zeros(2, 3, dtypetorch.float64, devicecuda) print(\nTensor b (on GPU):\n, tensor_b)else: print(CUDA 不可用使用 CPU 代替) tensor_b torch.zeros(2, 3, dtypetorch.float64)# 从 Python 列表创建张量list_data [[1, 2, 3], [4, 5, 6]]tensor_c torch.tensor(list_data)print(\n从列表创建的张量:\n, tensor_c)print(数据类型:, tensor_c.dtype) # 默认为 int64运行上述代码你会看到 Tensor 的创建方式灵活多样且通过.dtype、.device等属性可以轻松管理计算资源。注意torch.randn会返回一个torch.float32类型的张量而torch.zeros允许显式指定dtype这在混合精度训练中非常重要。## Tensor 的运算与自动广播机制Tensor 支持逐元素运算如加法、乘法和矩阵运算如mm、matmul。其中广播Broadcasting机制允许不同形状的张量进行运算其原理类似于 NumPy。广播规则如下1. 从最后一个维度开始对齐。2. 如果一个维度的大小为 1 或不存在则将该维度扩展为匹配的尺寸。3. 如果维度大小不一致且都不为 1则报错。下面是一个演示广播和矩阵运算的代码示例pythonimport torch# 演示广播加法a torch.tensor([[1, 2, 3], [4, 5, 6]]) # 形状 (2, 3)b torch.tensor([10, 20, 30]) # 形状 (3,)print(广播加法结果:\n, a b) # b 被广播为 (2, 3)# 矩阵乘法形状需兼容 (m, n) (n, p) - (m, p)c torch.randn(3, 2) # 形状 (3, 2)d torch.randn(2, 4) # 形状 (2, 4)result torch.mm(c, d) # 等价于 c dprint(\n矩阵乘法结果形状:, result.shape) # 输出 (3, 4)# 逐元素运算与原地操作e torch.ones(2, 3)e.mul_(2) # 原地乘以2注意下划线表示原地操作print(\n原地操作后的张量:\n, e)# 使用 view 改变形状不复制数据f torch.arange(12) # 一维张量 [0,1,...,11]g f.view(3, 4) # 重塑为 3x4注意元素总数必须匹配print(\n原始张量 f:, f)print(视图 g:\n, g)# 修改视图会影响原始数据g[0, 0] 99print(修改后 f:, f) # f 的第一个元素也变为 99这段代码展示了 Tensor 运算的灵活性和高效性。view操作通过调整步长实现了零拷贝的形状变换但要求原始张量在内存中是连续的。如果遇到非连续张量如转置后的张量可以使用.contiguous()方法强制转换为连续内存。## Tensor 的自动微分原理Tensor 与 Autograd 紧密结合实现了自动梯度计算。当设置requires_gradTrue时Tensor 会记录所有操作构建一个计算图。每个 Tensor 都有一个.grad_fn属性指向生成它的函数如AddBackward用于反向传播时计算梯度。关键原理计算图是动态构建的每次前向传播都会创建新的图结构。叶子节点用户创建的张量的grad_fn为None而中间节点的梯度通过链式法则计算。下面是一个完整的自动微分示例pythonimport torch# 创建需要梯度的张量x torch.tensor([2.0, 3.0], requires_gradTrue)w torch.tensor([1.0, -1.0], requires_gradTrue)b torch.tensor(0.5, requires_gradTrue)# 定义计算y sum(x * w) by torch.sum(x * w) b # 等价于 2*1 3*(-1) 0.5 -0.5print(y 的值:, y.item())# 反向传播计算梯度y.backward()print(dy/dx:, x.grad) # 梯度为 [w1, w2] [1.0, -1.0]print(dy/dw:, w.grad) # 梯度为 [x1, x2] [2.0, 3.0]print(dy/db:, b.grad) # 梯度为 1.0# 梯度累积如果再次调用 backward梯度会累积y2 torch.sum(x * w) b # 重新计算 yy2.backward() # 梯度会累加到之前的梯度上print(\n累积后的梯度:, x.grad) # 变为 [2.0, -2.0]注意默认情况下 PyTorch 会累积梯度因此在训练循环中需要手动清零使用optimizer.zero_grad()。此外with torch.no_grad()上下文管理器可以临时禁用梯度计算常用于评估模式。## Tensor 的 GPU 加速与性能优化Tensor 可以通过.to(device)在 CPU 和 GPU 之间迁移。GPU 上的 Tensor 运算利用 CUDA 核心并行执行显著提升性能尤其是在矩阵运算和卷积中。但频繁的数据迁移会带来开销因此应尽量将数据保持在同一个设备上。性能优化技巧- 使用torch.cuda.Stream实现异步操作。- 使用torch.jit.script或torch.compilePyTorch 2.0进行图优化。- 合理选择数据类型如float16代替float32以减少显存占用。## 总结Tensor 是 PyTorch 生态的基石它通过统一的数据抽象实现了跨设备计算、自动微分和高效的内存管理。本文从内存布局、创建操作、广播机制、自动微分到 GPU 加速层层深入揭示了其设计原理。理解 Tensor 的内部机制不仅有助于编写高效的代码还能为自定义算子或模型优化打下坚实基础。无论是初学者还是资深研究者掌握 Tensor 的精髓都是掌握 PyTorch 的第一步。

相关新闻

nftables精讲与例子(NAT、限速、限流量、禁ping等例子)

nftables精讲与例子(NAT、限速、限流量、禁ping等例子)

2026/7/27 2:55:34

nftables精讲与例子(NAT、限速、限流量、禁ping等例子) 为什么选择nftables?在Linux网络管理领域,iptables曾长期占据统治地位。但随着网络规模扩大和功能需求增加,iptables的局限性日益显现:规则集难以维护…

如何免费解锁九大网盘高速下载?这个开源工具让你告别限速烦恼

如何免费解锁九大网盘高速下载?这个开源工具让你告别限速烦恼

2026/7/27 2:55:34

如何免费解锁九大网盘高速下载?这个开源工具让你告别限速烦恼 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘…

Go语言并发编程:从volatile原理到内存模型与职业发展思考

Go语言并发编程:从volatile原理到内存模型与职业发展思考

2026/7/27 2:55:34

1. 项目概述:从“volatile”到职业焦虑的跨界思考 最近在整理Go语言并发编程的笔记时,我又一次遇到了那个经典且容易引发困惑的问题: “在Go里,什么时候需要用到volatile?” 这个问题看似是纯技术细节,但…

【2027最新】基于SpringBoot+Vue的课程作业管理系统管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的课程作业管理系统管理系统源码+MyBatis+MySQL

2026/7/27 3:55:36

博主介绍:💼 毕业设计解决方案 构建完整的毕业设计生态支撑体系,为学生提供从选题到交付的全链路技术服务: 技术选题库 微信小程序生态:精选100个符合市场趋势的前沿选题 Java企业级应用:汇集500个涵盖主流…

自动化消息工具的技术原理与伦理思考

自动化消息工具的技术原理与伦理思考

2026/7/27 3:55:36

1. 项目背景与核心功能解析最近在技术社区看到一个名为"ZuAnBot一键自动发送信息工具"的项目引发了不少讨论。这个工具的核心功能是通过预设脚本实现自动化信息发送,其中包含了一个颇具争议的"随机骂人语录"模块。作为从业十余年的自动化工具开…

硅光子光交换芯片设计:突破数据中心带宽与能耗瓶颈

硅光子光交换芯片设计:突破数据中心带宽与能耗瓶颈

2026/7/27 3:55:36

1. 项目概述在数据中心流量爆炸式增长的今天,传统电互连技术正面临带宽密度和能耗的双重瓶颈。我们团队最近完成的光交换芯片设计项目,正是针对这一行业痛点提出的创新解决方案。这种基于硅光子学的光交换芯片,实测带宽密度达到传统电互连的8…

C++高性能服务器实战:从Reactor模型到内存优化

C++高性能服务器实战:从Reactor模型到内存优化

2026/7/27 3:55:36

1. 项目概述:为什么选择C打造高性能服务器?在当今这个数据爆炸、实时交互需求旺盛的时代,服务器应用的性能直接决定了用户体验和业务天花板。无论是支撑千万级并发的在线游戏、处理高频交易的金融系统,还是需要低延迟响应的物联网…

AI论文降重实战:48小时突破高校检测系统

AI论文降重实战:48小时突破高校检测系统

2026/7/27 3:55:36

1. 论文降重实战背景:当AI检测成为毕业拦路虎去年帮表弟处理毕业论文时,我们遇到了一个棘手问题:他用了某AI写作工具生成的初稿,在Turnitin等查重系统里显示原创度没问题,但学校新增的AI检测模块却给出了90%的AI生成概…

GitLab SSH密钥配置全解析:从非对称加密原理到多密钥管理实战

GitLab SSH密钥配置全解析:从非对称加密原理到多密钥管理实战

2026/7/27 3:45:36

1. 项目概述:从“输入密码”到“自动登录”的本质跨越每次在终端里敲下git push或git pull,看着代码行云流水般与远程仓库同步,你是否想过,为什么我们不再需要反复输入用户名和密码了?这背后默默工作的功臣&#xff0c…

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

2026/7/26 0:04:02

目标:电脑作为RTSP 服务端,循环推送 H264/H265 视频流; RDK X5 通过 rtsp2display 拉流预览,完全不需要在开发板编译 live555。 提供两套成熟方案: ✅ 方案 A:FFmpeg(最简单,优先推…

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

2026/7/26 0:04:02

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

2026/7/26 0:04:02

说实话,提到PDF拆分再压缩,我真是被折腾得够呛。 上个月公司年度合同归档,一份300多页的PDF总合同,需要按年份拆分成三个独立文件,再分别压缩到10MB以内方便邮件发送各部门确认。我心想这还不简单?先找个海…

多模态 AI 前端工程——图像上传、压缩与流式返回的协同设计

多模态 AI 前端工程——图像上传、压缩与流式返回的协同设计

2026/7/27 0:05:04

多模态 AI 前端工程——图像上传、压缩与流式返回的协同设计 一、多模态对话的「首字节延迟」:上传与流式的协同鸿沟 多模态 AI 应用的前端体验,往往卡在"首字节延迟"上。用户上传一张图片,提一个问题,然后盯着空白对…

【微科普】网红水晶香薰真相拆解:透明固体香薰并非香精结晶,一文理清各类无火香薰释香机理

【微科普】网红水晶香薰真相拆解:透明固体香薰并非香精结晶,一文理清各类无火香薰释香机理

2026/7/27 0:05:04

文章目录第一章 大众普遍存在的认知误区:水晶香薰是芳香烃结晶产物1.1 聚丙烯酸钠凝胶水晶珠体系(市面占比90%家用水晶香薰)1.2 无机盐硬质结晶载体:泻盐与钾明矾香薰原石1.3 植物多糖与PVA整块果冻型水晶香膏1.4 唯一特例&#x…

优启通3.7修改版:深度优化的PE系统维护工具

优启通3.7修改版:深度优化的PE系统维护工具

2026/7/27 0:05:04

1. 项目概述今天要跟大家分享的是一个经过深度优化的PE工具——优启通3.7(2025修改版)。这个版本是在原版基础上进行了大量功能增强和兼容性改进的12月最新版本,特别适合系统维护人员和电脑爱好者使用。作为一个长期从事IT运维的老兵&#xf…