当前位置: 首页 > article >正文

PyTorch张量操作实战:从基础运算到CNN应用

1. PyTorch张量基础从概念到创建第一次接触PyTorch张量时我完全被各种术语搞晕了。什么标量、向量、矩阵还有这个奇怪的张量词。后来才发现其实张量就是多维数组的另一种说法只不过在深度学习中我们习惯用这个数学术语。1.1 张量的本质与属性张量有三个核心属性让我花了些时间才真正理解秩(Rank)表示张量的维度数量。比如标量是0维向量是1维矩阵是2维轴(Axis)张量的具体维度比如一个2D张量有行轴和列轴形状(Shape)每个轴上的元素数量比如(3,4)表示3行4列# 创建一个3x4的2D张量 t torch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) print(t.shape) # 输出: torch.Size([3, 4]) print(t.ndim) # 输出: 2 (表示2维)1.2 创建张量的四种正确姿势在项目中踩过坑后我总结出创建张量的最佳实践torch.tensor()最常用的方法会复制数据torch.as_tensor()共享数据内存适合NumPy数组转换torch.from_numpy()专为NumPy数组设计共享内存特殊初始化方法像torch.zeros(), torch.ones(), torch.rand()import numpy as np # 从Python列表创建 data [[1,2], [3,4]] t1 torch.tensor(data) # 从NumPy数组创建(共享内存) arr np.array(data) t2 torch.as_tensor(arr) # 特殊初始化 t3 torch.zeros(2,3) # 2行3列的全0张量 t4 torch.rand(2,2) # 2x2的随机张量注意在GPU计算时要注意数据是在CPU还是GPU上。用.cuda()方法可以将张量移到GPU但数据传输有开销小数据量时可能得不偿失。2. 张量变形像玩橡皮泥一样操作数据在实际CNN项目中我经常需要调整张量形状来适配网络层。reshape、view、squeeze这些操作刚开始容易混淆直到我找到了它们的本质区别。2.1 reshape vs view内存布局的玄机两者都能改变张量形状但有个关键区别reshape可能返回原始张量的视图或副本view必须返回视图要求内存连续t torch.arange(12) print(t.reshape(3,4)) # 3行4列 print(t.view(4,3)) # 4行3列 # 先转置会使内存不连续此时不能用view t_t t.reshape(3,4).T try: t_t.view(12) # 会报错 except RuntimeError as e: print(e) # view size is not compatible with input tensors...2.2 squeeze和unsqueeze维度的增删这两个操作在处理CNN输入时特别有用squeeze删除长度为1的维度unsqueeze在指定位置增加长度为1的维度# 模拟CNN输入批次(批量大小1, 1通道, 28x28图像) input torch.rand(1,1,28,28) # 删除批量维度 squeezed input.squeeze(dim0) # 形状变为(1,28,28) # 增加通道维度 t torch.rand(28,28) # 灰度图像 unsqueezed t.unsqueeze(0) # 形状变为(1,28,28)2.3 张量拼接构建批次的神器在准备训练数据时我常用torch.cat和torch.stackcat沿现有维度拼接stack创建新维度拼接# 两个28x28的图像张量 img1 torch.rand(28,28) img2 torch.rand(28,28) # 沿高度维度拼接(56x28) cat_result torch.cat([img1, img2], dim0) # 创建批次维度(2x28x28) stack_result torch.stack([img1, img2], dim0)3. 张量运算从元素操作到广播机制在实现自定义层时深刻理解了PyTorch的运算规则。有些坑只有踩过才知道怎么避开。3.1 元素级运算的三种形式PyTorch支持三种等价的元素操作方式运算符重载t1 t2函数形式torch.add(t1, t2)原地操作t1.add_(t2)(节省内存)t1 torch.tensor([[1,2], [3,4]]) t2 torch.tensor([[5,6], [7,8]]) # 三种加法等价 result1 t1 t2 result2 torch.add(t1, t2) t1.add_(t2) # 会修改t1本身3.2 广播机制形状不同的张量如何运算广播规则让我又爱又恨。它自动扩展小张量来匹配大张量形状但理解不透容易出错。广播三步走从最后一个维度开始比较维度大小相同或其中一个为1才能广播缺失维度视为1# 矩阵(2,3) 向量(3,) → (2,3) matrix torch.tensor([[1,2,3], [4,5,6]]) vector torch.tensor([10,20,30]) result matrix vector # [[11,22,33], [14,25,36]] # 不匹配的例子会报错 bad_vector torch.tensor([10,20]) try: matrix bad_vector except RuntimeError as e: print(e) # The size of tensor a (3) must match...3.3 约简操作降维与统计在计算损失和指标时约简操作必不可少t torch.rand(3,4) # 3行4列 # 常用约简操作 print(t.sum()) # 所有元素和 print(t.mean(dim0)) # 每列均值 print(t.max(dim1)) # 每行最大值及位置 print(t.argmin()) # 最小值的扁平索引4. CNN实战张量操作的综合应用在构建CNN时我真正体会到张量操作的重要性。从输入预处理到特征图变换每一步都离不开张量操作。4.1 CNN输入张量的标准格式PyTorch使用NCHW格式N批量大小C通道数H高度W宽度# 模拟一个批次(2张RGB图像224x224) batch_size 2 channels 3 height width 224 images torch.rand(batch_size, channels, height, width) # 归一化处理(广播的应用) mean torch.tensor([0.485, 0.456, 0.406]).reshape(1,3,1,1) std torch.tensor([0.229, 0.224, 0.225]).reshape(1,3,1,1) normalized (images - mean) / std4.2 卷积层中的张量变换理解卷积输入输出形状变化很关键import torch.nn as nn # 定义卷积层 conv nn.Conv2d(in_channels3, out_channels64, kernel_size3, stride1, padding1) # 前向传播 output conv(normalized) print(output.shape) # torch.Size([2, 64, 224, 224]) # 手动计算输出形状 def conv_output_size(input_size, kernel_size, stride1, padding0): return (input_size - kernel_size 2*padding) // stride 1 h_out conv_output_size(224, 3, padding1) # 2244.3 全连接层前的展平操作从卷积到全连接的过渡需要展平操作# 方法1使用view flattened output.view(output.size(0), -1) # 保持批量维度 # 方法2PyTorch的flatten flattened torch.flatten(output, start_dim1) # 从第1维开始展平 print(flattened.shape) # torch.Size([2, 64*224*224])4.4 张量操作性能优化技巧在大规模训练中我总结了几个性能要点避免不必要的拷贝尽量使用as_tensor而不是tensor利用原地操作add_、mul_等后缀为_的操作合理使用torch.no_grad()在推理时禁用梯度计算注意设备一致性确保所有张量在相同设备(CPU/GPU)上# 性能对比示例 def slow_version(t): result t 1 result result * 2 return result def fast_version(t): result t.add_(1) result.mul_(2) return result # 使用no_grad加速推理 with torch.no_grad(): output model(input_tensor)在真实项目中这些张量操作构成了深度学习的基础。记得刚开始时我因为不理解广播规则调试了一整天。现在回头看掌握PyTorch张量就像学会了乐高积木的基本拼法之后搭建任何复杂模型都游刃有余了。

相关文章:

PyTorch张量操作实战:从基础运算到CNN应用

1. PyTorch张量基础:从概念到创建 第一次接触PyTorch张量时,我完全被各种术语搞晕了。什么标量、向量、矩阵,还有这个奇怪的"张量"词。后来才发现,其实张量就是多维数组的另一种说法,只不过在深度学习中我们…...

从零开始:使用ecCodes库高效解析GRIB文件

1. 为什么需要ecCodes库处理GRIB文件 第一次接触气象数据时,我被GRIB文件搞得一头雾水。这种二进制格式就像个黑盒子,明明知道里面装着宝贵的温度、气压、风速数据,却不知道怎么取出来。后来发现ecCodes库就像开罐器,能轻松打开这…...

【ZGC性能调优终极指南】:20年JVM专家亲授5大实战瓶颈突破法

第一章:ZGC核心机制与性能边界全景透视ZGC(Z Garbage Collector)是JDK 11引入的低延迟垃圾收集器,专为处理TB级堆内存与毫秒级停顿目标而设计。其核心突破在于并发标记、并发重定位与着色指针(Colored Pointers&#x…...

大麦网自动购票工具:技术原理与多场景应用指南

大麦网自动购票工具:技术原理与多场景应用指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 在数字化票务时代,热门演出门票往往在开票瞬间售罄&…...

春招已经过半,这一波再不动手,基本就没位置了

关注 霍格沃兹测试学院公众号,回复「资料」,领取人工智能测试开发技术合集导读3月底这个时间点,如果你还在纠结“要不要投”,那基本已经慢半拍了。现在的真实情况是:大厂已经进入筛选面试并行阶段一部分公司已经开始发…...

Pixel Couplet Gen效果展示:抽象门神像素方块+动态卷轴交互演示

Pixel Couplet Gen效果展示:抽象门神像素方块动态卷轴交互演示 1. 项目概览 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。通过ModelScope大模型驱动,将传统春联创作转化为充满游戏感的数字体验。 核心特点&#xff1a…...

为什么选择Zabbix而不是Prometheus?K8s监控工具深度对比与实战配置

Zabbix与Prometheus在Kubernetes监控中的技术决策指南 当企业级容器平台需要构建监控体系时,技术选型往往成为困扰架构师的核心难题。作为当下最主流的两个开源监控解决方案,Zabbix与Prometheus在Kubernetes生态中的表现各有千秋。本文将基于实际生产环境…...

GyverDS18库:工业级DS18B20单总线温度驱动设计与实践

1. GyverDS18库深度解析:面向工业级应用的DS18B20全功能驱动设计Dallas DS18B20是业界最成熟的单总线数字温度传感器之一,凭借其独特的1-Wire协议、无需外部ADC、支持多点组网及寄生供电能力,在工业监控、环境监测、智能家电等领域广泛应用。…...

Ostrakon-VL扫描终端实战教程:像素特工式零售图像识别部署指南

Ostrakon-VL扫描终端实战教程:像素特工式零售图像识别部署指南 1. 像素特工终端介绍 想象你是一位未来世界的零售侦探,手持高科技扫描仪在商店里穿梭。Ostrakon-VL扫描终端就是你的数字助手,它能帮你"看"懂货架上的每一个细节。这…...

别再手动写Excel了!用Coze+GPT-4o,5分钟把Word需求文档变成测试用例表格

从Word到Excel:零代码打造智能测试用例生成流水线 每次产品需求文档更新后,测试团队最头疼的莫过于手动编写成百上千条测试用例。传统方式下,测试工程师需要反复阅读PRD文档,逐条提取功能点,再按照固定模板填充到Excel…...

Chandra AI企业知识管理方案:文档智能检索与摘要生成

Chandra AI企业知识管理方案:文档智能检索与摘要生成 1. 引言 企业每天都在产生海量文档——合同、报告、PPT、技术文档...这些宝贵的知识资产往往散落在各处,查找困难,利用率低。传统的关键词搜索就像在黑暗中摸索,找到的文档可…...

抖音音频高效提取工具:从繁琐操作到一键解决方案

抖音音频高效提取工具:从繁琐操作到一键解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...

PyTorch 3.0静态图分布式训练实战指南:从模型切分、通信压缩到GPU显存零冗余,7步上线千卡集群

第一章:PyTorch 3.0静态图分布式训练的演进逻辑与企业级定位PyTorch 3.0并非官方已发布的版本号(截至2024年,PyTorch最新稳定版为2.3),但该命名在此语境中特指工业界对“具备生产就绪型静态图能力与原生分布式协同范式…...

Win11Debloat系统优化工具:全面提升Windows性能的技术指南

Win11Debloat系统优化工具:全面提升Windows性能的技术指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...

DP数组的容量要不要+1?

其实,dp 数组要不要 1,完全取决于 “DP数组”下标代表什么 。 简单来说,只有两种情况。我们结合“凑钱”题和经典的“爬楼梯”题来对比一下。📏 情况一:下标代表“金额/重量/容量”(需要 1) 场景…...

本地部署openclaw(window环境下)不用花钱买token版

步骤一:参考视频到安装 openclaw 前就行(剩下的步骤和博主不太样) 步骤 2 1、免费注册一个 NVIDIA NIM 账户: 【点击前往】 登入后在设置中心生成你自己的API Keys ,过期时间选择永不过期,目前可以直接免…...

视频画面匹配软件 影视片段匹配软件出售 创作效率提升 速橙软件-相同视频片段匹配系统

免费下载链接:http://www.suchengai.cn/作为一名视频创作者或影视解说博主,你是否经常面临这样的困境?为了制作一个10分钟的视频解说,需要花费数小时甚至一整天的时间,在原始影片中手动查找和剪辑对应的片段。这不仅效…...

解锁Unity游戏定制潜能:MelonLoader全方位应用指南

解锁Unity游戏定制潜能:MelonLoader全方位应用指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 副标题&#xff…...

5分钟上手Godot 4.0地形系统:用AutoTile实现像素风草地自动拼接(含Layer新功能演示)

5分钟掌握Godot 4.0地形系统:用AutoTile实现像素风无缝拼接 在像素风格游戏开发中,地形拼接一直是让开发者头疼的问题——如何让草地、石块、沙土等元素自然过渡?传统方案往往需要手动放置大量图块或编写复杂逻辑。Godot 4.0的TileMap系统带来…...

steam_api.dll是什么文件?全面解析其作用与安全修复方法

不少玩家在启动Steam游戏时,都曾被“无法启动此程序,因为计算机中丢失steam_api.dll”这样的提示拦在门外。看着这串乱码般的文件名,第一反应通常是:这是什么?为什么没了它游戏就不动了?别急,这…...

Android项目中的Gradle文件详解:从基础配置到高级技巧

Android项目中的Gradle文件详解:从基础配置到高级技巧 在Android开发的世界里,Gradle文件就像是一个项目的"大脑",它控制着构建过程的方方面面。对于有一定经验的Android开发者来说,深入理解Gradle文件的配置不仅能够提…...

N_m3u8DL-CLI-SimpleG:解决M3U8流媒体下载难题的开源解决方案

N_m3u8DL-CLI-SimpleG:解决M3U8流媒体下载难题的开源解决方案 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG M3U8流媒体格式已成为在线视频传输的主流标准&#xff0…...

**Flutter实战进阶:用自定义RenderObject打造高性能图表组件**在Flutter开发中,我们经

Flutter实战进阶:用自定义RenderObject打造高性能图表组件 在Flutter开发中,我们经常需要展示复杂的数据可视化效果,比如折线图、柱状图等。虽然社区已有不少成熟的图表库(如charts_flutter),但它们往往无法…...

SVN分支管理避坑指南:为什么你的Merge two different trees总会删文件?

SVN分支合并的底层逻辑与实战避坑指南 当你面对SVN分支合并时是否经常遇到文件神秘消失的情况?特别是使用TortoiseSVN的"Merge two different trees"功能时,那些本应保留的文件为何总是不翼而飞?本文将深入解析SVN合并的底层机制&a…...

异构计算与边缘协同:基于 ARM/X86 的企业级 AI 视频中台架构设计

引言:算力碎片化时代的“异构”挑战 在 AI 落地安防的深水区,架构师面临的最大挑战不再是算法模型的精度,而是算力底座的碎片化。项目现场往往呈现出复杂的“万国牌”局面:总部机房可能部署着 NVIDIA A100 的 x86 服务器用于离线训…...

VSCode里装个Cline,真能让写代码快10倍?我的真实体验和避坑指南

VSCode里装个Cline,真能让写代码快10倍?我的真实体验和避坑指南 第一次听说Cline这个VSCode插件时,我内心是充满怀疑的。作为一个在代码堆里摸爬滚打多年的开发者,早已对各种"革命性"工具免疫。但当我看到同行在短短十分…...

智能视频PPT提取:从动态内容到静态文档的高效转化方案

智能视频PPT提取:从动态内容到静态文档的高效转化方案 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 场景痛点:视频内容提取的三大核心挑战 如何从90分钟的…...

全面只使用sessionid来验证登录-----客户端只保留sessionid

虽然说sessionid 也是可以伪造的,可以快速发送伪造的sessionid,但是因为sessionid是32位的随机字符串,暴力破解需要几亿年,安全性比user_id1,user_id2 高得多。不过一个有意思的事情是:如果我把user_id1改成 user_id32位随机字符串…...

从一篇TIE论文的稳定性分析入手,手把手复现Bode图判据的MATLAB实现

从TIE论文案例到MATLAB实践:Bode图判据的稳定性分析全解析 在电力电子系统设计中,LCL型并网逆变器的稳定性分析一直是工程师面临的挑战。2015年发表在IEEE Transactions on Industrial Electronics上的那篇经典论文,为我们提供了一个绝佳的研…...

jsDelivr CDN:如何为你的开源项目选择最佳加速方案

1. 为什么你的开源项目需要jsDelivr CDN 作为一个开源项目维护者,我深刻理解静态资源加载速度对用户体验的影响。去年我的一个Vue组件库项目就遇到过这样的问题:海外用户访问飞快,但国内用户总是抱怨加载缓慢。直到我把资源托管到jsDelivr&am…...