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

PyTorch张量操作保姆级教程:从arange创建到广播机制,新手避坑指南

PyTorch张量操作保姆级教程:从arange创建到广播机制,新手避坑指南

第一次接触PyTorch的张量操作时,很多人会被各种形状变换和广播规则搞得晕头转向。记得我刚开始学习时,经常因为不理解视图(view)和实际存储的区别而踩坑。本文将带你从最基础的张量创建开始,一步步掌握PyTorch的核心操作技巧,避开那些新手常犯的错误。

1. 张量创建与基础属性

1.1 使用arange创建张量

torch.arange()是创建连续数值张量最常用的方法之一。它类似于Python的range()函数,但直接生成张量而非列表:

import torch # 创建包含0到11的12个整数的行向量 x = torch.arange(12) print(x) # 输出: tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

注意:与NumPy不同,PyTorch的arange默认生成的是int64类型而非float类型

1.2 张量形状与大小

理解张量的形状(shape)是操作张量的基础。shape属性返回一个元组,表示张量在每个维度上的大小:

print(x.shape) # 输出: torch.Size([12]) print(x.size()) # 与shape等价 print(x.numel()) # 元素总数: 12

1.3 特殊张量创建

PyTorch提供了多种创建特殊张量的方法:

  • torch.zeros(): 全0张量
  • torch.ones(): 全1张量
  • torch.randn(): 标准正态分布随机数
# 创建2×3×4的全0张量 zeros_tensor = torch.zeros(2, 3, 4) # 创建3×4的标准正态分布随机张量 randn_tensor = torch.randn(3, 4)

2. 张量形状操作与视图

2.1 改变张量形状

reshape()view()可以改变张量的形状而不改变其数据:

# 将12元素的行向量变为3×4矩阵 matrix = x.reshape(3, 4) print(matrix)

重要区别:view()要求张量在内存中是连续的,而reshape()会自动处理非连续情况

2.2 常见形状操作

方法描述示例
reshape()改变形状x.reshape(3,4)
squeeze()去除长度为1的维度x.squeeze()
unsqueeze()增加长度为1的维度x.unsqueeze(0)
transpose()交换两个维度x.transpose(0,1)

3. 张量运算与广播机制

3.1 基本数学运算

PyTorch张量支持各种数学运算,运算符重载使其使用非常直观:

x = torch.tensor([1.0, 2, 4, 8]) y = torch.tensor([2, 2, 2, 2]) print(x + y) # 加法 print(x - y) # 减法 print(x * y) # 逐元素乘法 print(x / y) # 除法 print(x ** y) # 幂运算

3.2 广播机制详解

广播是PyTorch中处理不同形状张量运算的强大机制。其核心规则是:

  1. 从最后一个维度开始向前比较
  2. 维度大小相等或其中一个为1时可以广播
  3. 缺失的维度被视为1
a = torch.arange(3).reshape(3, 1) b = torch.arange(2).reshape(1, 2) print(a + b) # 输出3×2矩阵

常见错误:不理解广播规则可能导致意外的结果或错误。建议先用小张量测试广播行为

4. 索引与原地操作

4.1 基本索引技巧

PyTorch的索引语法与NumPy非常相似:

X = torch.arange(12).reshape(3, 4) print(X[-1]) # 最后一行 print(X[1:3]) # 第二到第三行 print(X[:, 2]) # 第三列 print(X[1, 2]) # 第二行第三列元素

4.2 原地修改与注意事项

PyTorch中有两种修改张量的方式:

  1. 常规操作会创建新张量
  2. 以下划线结尾的方法执行原地操作
# 常规方法创建新张量 new_X = X + 1 # 原地操作修改原张量 X.add_(1) # 每个元素加1 X[0] = 10 # 直接赋值 X.fill_(5) # 全部填充为5

警告:不当的原地操作可能导致自动梯度计算错误。在训练神经网络时要特别小心

5. 类型转换与NumPy互操作

5.1 数据类型转换

PyTorch张量支持多种数据类型,可以通过to()方法转换:

a = torch.tensor([3.5]) print(a.int()) # 转为整型 print(a.float()) # 转为浮点型 print(a.double()) # 转为双精度

5.2 与NumPy的互操作

PyTorch可以方便地与NumPy数组相互转换:

# PyTorch转NumPy X_np = X.numpy() # NumPy转PyTorch X_torch = torch.from_numpy(X_np)

注意:CPU上的张量与NumPy数组共享内存,修改一个会影响另一个

在实际项目中,我发现最常遇到的张量操作问题通常源于对形状和广播机制理解不够深入。建议新手多使用小张量进行实验,逐步建立直观感受。例如,当不确定两个张量能否广播时,可以先用torch.broadcast_tensors()查看广播后的形状。

http://www.jsqmd.com/news/676606/

相关文章:

  • 信号处理中的插值与采样技术详解
  • 2026年衬塑设备制造商中如皋佳百费用如何,听听用户评价 - 工业推荐榜
  • 告别轮询:用ibv_req_notify_cq和事件驱动优化你的RDMA应用性能
  • 【Matlab代码】基于SCSSA-CNN-BiGRU-Attention(改进麻雀搜索算法优化双向门控循环单元网络)多变量回归预测
  • PinWin:你的窗口为何总被遮挡?这款开源神器让重要信息永不消失
  • 超越默认样式:手把手教你用mplfinance定制专属量化图表风格(从配色到字体)
  • M62429L双声道音量IC驱动:从硬件引脚到软件时序的实战解析
  • 别再死记硬背了!用Python+Jupyter Notebook手把手教你计算化学反应吉布斯自由能变
  • 【ArcGIS Pro二次开发】:三调地类面积精准统计与数据清洗实战
  • 5分钟搞定OFD转PDF:开源神器Ofd2Pdf终极使用指南
  • USB PD PPS便携电源设计:原理与工程实践
  • VHDL并发信号赋值与BLOCK语句实战解析
  • 齿轮箱零部件及其装配质检中的TVA技术突破(18)
  • 聊聊不错的转接线厂家,钦利发口碑如何? - 工业品网
  • MATLAB绘图避坑:箭头颜色总是不对?一文搞懂arrow3和quiver3的颜色控制机制
  • CodeForces-2168B Locate 题解
  • 别再只会用$random了!手把手教你用Verilog LFSR生成更可控的伪随机数(附完整代码)
  • 在Windows上运行iOS应用的终极方案:ipasim跨平台模拟器深度解析
  • 同态加密实战:用Go实现一个隐私保护的投票系统(附完整代码)
  • 表和约束的区别
  • 从图像到文本:对比学习Loss(InfoNCE)在CLIP和SimCSE中的实战调参指南
  • 别再死记公式了!用Python+LTspice快速验证RC/LC滤波器设计(附代码)
  • YOLOv8集成DCNv2:从原理到实战的涨点技巧
  • ComfyUI-SUPIR 终极指南:三步实现专业级图像超分辨率
  • TVA时代企业IT工程师的转型之路(一)
  • 从CPU指纹到安全防御:如何利用CPUID与LBR/BTS检测内核级Rootkit?
  • 告别libpng!用这个轻量级C库lodepng,5分钟搞定PNG图片解码(附完整代码)
  • 手把手教你用Logstash Grok插件解析华为防火墙USG6600E的Syslog日志(附完整正则)
  • 别再用@Async默认线程池了!手把手教你为不同业务定制专属的ThreadPoolTaskExecutor
  • CosyVoice语音克隆5分钟上手:3步搞定声音复制,零基础也能玩转