pytorch张量运算的广播机制

PyTorch 的广播机制(broadcasting)是指在进行张量运算时,自动扩展较小张量的形状以匹配较大张量的形状,使它们能够进行逐元素运算。广播机制避免了手动扩展张量的繁琐过程,并且在不增加内存开销的情况下进行高效计算。

广播规则

  1. 比较张量的形状:从后向前比较两个张量的每个维度(即从最右边的维度开始)。
  2. 维度匹配
    • 如果两个维度相等,则可以进行运算。
    • 如果一个张量在该维度上为 1,另一个张量为任意数值,则形状为 1 的张量会沿着该维度扩展,以匹配另一个张量的形状。
    • 如果两个张量在某个维度上不相等且没有一个是 1,则无法进行广播,运算会抛出错误。

广播机制的示例代码

1. 标量与张量的运算
复制代码
import torch

# 标量和张量相加
scalar = torch.tensor(3)
tensor = torch.tensor([1, 2, 3])

result = scalar + tensor
print(result)  # 输出: tensor([4, 5, 6])
2. 不同形状的张量运算
复制代码
import torch

# 创建两个形状不同的张量
A = torch.tensor([[1, 2, 3], [4, 5, 6]])  # 形状为 [2, 3]
B = torch.tensor([1, 2, 3])              # 形状为 [3]

# B 张量的形状会沿着第一个维度自动扩展为 [2, 3]
result = A + B 
print(result)   # 输出: tensor([[2, 4, 6], [5, 7, 9]])
3. 高维张量的广播
复制代码
import torch

# 形状为 [2, 1, 3]
C = torch.tensor([[[1, 2, 3]], [[4, 5, 6]]])

# 形状为 [3]
D = torch.tensor([1, 2, 3])

# D 张量的形状会沿着第一个和第二个维度扩展为 [2, 1, 3]
result = C + D  
print(result)   # 输出: tensor([[[ 2,  4,  6]], [[ 5,  7,  9]]])
4. 不兼容的张量运算
复制代码
import torch

# 形状为 [2, 3]
E = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 形状为 [2]
F = torch.tensor([1, 2])

# 尝试进行运算将抛出错误,因为 E 和 F 在最后一个维度上不匹配
try:
    result = E + F  # 形状不兼容,会抛出错误
except RuntimeError as e:
    print("Error:", e)

总结

广播机制极大简化了张量运算的代码编写,特别是在处理不同行数和列数的张量时。理解广播机制能够帮助你编写更高效、简洁的代码,并充分利用 PyTorch 的计算能力。

相关推荐
fthux2 小时前
装闭 RenoPit 源码解析(09):AnalysisEngine装修闭坑分析主流程
人工智能·ai·开源·github·open source·renopit
敏编程2 小时前
开源项目 NextBand:探索融合健康传感、语音交互与 AI Agent 的下一代可穿戴设备
人工智能
ovO2 小时前
我按下“发送”之后:DeepSeek Harness 如何把一次请求变成 1,177 个增量片段
人工智能·开源·deepseek
2603_965148113 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
昨日之日20063 小时前
LTX-2.5:更清晰、更可控、同步音画、多镜头连贯的AI视频神器
人工智能·音视频
九硕智慧建筑一体化厂家3 小时前
数字化管控落地,直流照明构筑安全照明体系
运维·人工智能·笔记·安全·智慧城市
江厌013 小时前
本地部署DeepSeek显卡怎么选?我把显存计算公式和实测记录写下来了
人工智能·百度·联想工作站·代理商推荐·渠道对比·工作站
小席是个热心肠3 小时前
AI相关的自我学习
java·人工智能·学习
FII工业富联科技服务3 小时前
工业AI自治的演进趋势:从内容生成到Agent驱动的工厂运营范式转变
人工智能
程序猿编码3 小时前
不用GPU,不用多线程,我用C++20手写了一个Gemma 3推理引擎
pytorch·语言模型·大模型·c++20·推荐算法