深度学习|pytorch基本运算-广播失效

【1】引言

前序文章中,已经学习了pytorch基本运算中的生成随机张量、生成多维张量,以及张量的变形、加减和广播运算。

今天的文章在之前学习的基础上,进一步探索。

前序文章链接为:

深度学习|pytorch基本运算-CSDN博客

【2】广播失效

前序文章在最后给出了广播运算的基础代码:

python 复制代码
# 导入包
import torch
# 生成多为维张量
y=torch.tensor([1,2,3])
z=torch.tensor([
    [3],
    [2],
    [1]
])
#打印
print('y=',y)
print('z=',z)
# 
a=y+z
print('a=',a)

在这个项目中,行向量y会沿着行广播(复制),列向量z会沿着列广播(复制),实际运行效果和下述代码一样:

python 复制代码
# 导入包
import torch
# 生成多为维张量
y=torch.tensor([[1,2,3],
               [1,2,3],
                [1,2,3]])
z=torch.tensor([
    [3,3,3],
    [2,2,2],
    [1,1,1]
])
#打印
print('y=',y)
print('z=',z)
#
a=y+z
print('a=',a)

实际运行后的效果为:

++图1 广播运行效果++

但实际上,如果稍微修改代码,就会有广播失效的情况:

python 复制代码
# 导入包
import torch
# 生成多为维张量
y=torch.tensor([[1,2,3,1],
               [1,2,3,1],
                [1,2,3,1]])
z=torch.tensor([
    [3,3,3],
    [2,2,2],
    [1,1,1]
])
#打印
print('y=',y)
print('z=',z)
#
a=y+z
print('a=',a)

上述代码运行后,会直接报错:

a=y+z

~^~

RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 1

这里报错的意思是:在非单例维度1上,第一个矩阵a有4个数,第二个矩阵b有3个数,无法匹配。

在pytorch中,对于维度的规定是:

在竖直方向是第0维度, 代码中的y和z都有3行,匹配;

在水平方向是第1维度, 代码中的y和z分别有4列和3列,不匹配,无法广播。

需要注意到报错信息中,a(4)和b(3)是python语言报错的惯用写法,实际对应的就是y(4)和z(3)。

真实的不匹配来源是:**矩阵y有4列数据,矩阵z有3列数据,矩阵z既不可能每一列都复制一遍来广播,也不可能任选一列复制来广播,所以无法广播;但对于单独的一列,则没有这样的烦恼,直接每一列都复制即可。**比如下述代码:

python 复制代码
# 导入包
import torch
# 生成多为维张量
y=torch.tensor([[1,2,3,1],
               [1,2,3,1],
                [1,2,3,1]])
z=torch.tensor([
    [3],
    [2],
    [1]
])
#打印
print('y=',y)
print('z=',z)
#
a=y+z
print('a=',a)

运行后的效果为:

++图2 单列多行广播运行效果++

上述情况是第1维度即列的原因造成的无法广播,如果修改第0维度即行来测试,有如下代码:

python 复制代码
# 导入包
import torch
# 生成多为维张量
y=torch.tensor([[1,2,3,1],
               [1,2,3,1],
                [1,2,3,1]])
z=torch.tensor([
    [3],
    [2],
    [1],
    [1]
])
#打印
print('y=',y)
print('z=',z)
#
a=y+z
print('a=',a)

代码运行后的报错为:

a=y+z

~^~

RuntimeError: The size of tensor a (3) must match the size of tensor b (4) at non-singleton dimension 0

和前述分析的原因一样:3行和4行不对应,无法广播。

矩阵y有3行数据,矩阵z有4行数据,矩阵y既不可能每一行都复制一遍来广播,也不可能任选一行复制来广播,所以无法广播。

【3】总结

探索了pytorch的基本运算中广播失效的情况及其原因。

相关推荐
不剪发的Tony老师22 分钟前
sqlite-vec:谁说SQLite不是向量数据库?
数据库·人工智能·sqlite
小猪猪_11 小时前
神经网络与深度学习(第二章)
深度学习·神经网络·机器学习
白熊1881 小时前
【机器学习基础】机器学习入门核心:Jaccard相似度 (Jaccard Index) 和 Pearson相似度 (Pearson Correlation)
人工智能·机器学习
pen-ai1 小时前
【深度学习】17. 深度生成模型:DCGAN与Wasserstein GAN公式深度推导
人工智能·深度学习·生成对抗网络
简简单单做算法2 小时前
基于mediapipe深度学习的虚拟画板系统python源码
人工智能·python·深度学习·mediapipe·虚拟画板
qq_314009832 小时前
Windows+VSCode搭建小智(xiaozhi)开发环境
ide·人工智能·vscode·编辑器·开源软件
技术便签2 小时前
第一篇:揭示模型上下文协议(MCP):AI的通用连接器
人工智能·ai编程·language model·多智能体·智能体
AI视觉网奇2 小时前
opencv 可视化函数
人工智能·opencv·计算机视觉
zstar-_4 小时前
【Ragflow】24.Ragflow-plus开发日志:增加分词逻辑,修复关键词检索失效问题
人工智能·python·llm
love530love4 小时前
【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南
大数据·运维·人工智能·windows·笔记·python·conda