Pytorch中的广播机制详解(Broadcast)
作者:cv_lhp 发布时间:2022-11-17 05:22:51
1. Pytorch中的广播机制
如果一个Pytorch运算支持广播的话,那么就意味着传给这个运算的参数会被自动扩张成相同的size,在不复制数据的情况下就能进行运算,整个过程可以做到避免无用的复制,达到更高效的运算。
广播机制实际上是在运算过程中,去处理两个形状不同向量的一种手段。
pytorch中的广播机制和numpy中的广播机制一样, 因为都是数组的广播机制。
2. 广播机制的理解
以数组A和数组B的相加为例, 其余数学运算同理
核心:如果相加的两个数组的shape不同, 就会触发广播机制:
1)程序会自动执行操作使得A.shape==B.shape;
2)对应位置进行相加运算,结果的shape是:A.shape和B.shape对应位置的最大值,比如:A.shape=(1,9,4),B.shape=(15,1,4),那么A+B的shape是(15,9,4)
3. 两个张量进行广播机制的条件
3.1 两个张量都至少有一个维度
#像下面这种情况下就不行,因为x不满足这个条件。
x=torch.empty((0,))
y=torch.empty(2,2)
3.2 按从右往左顺序看两个张量的每一个维度,x和y每个对应着的两个维度都需要能够匹配上。
什么情况下算是匹配上了?满足下面的条件就可以:
a.这两个维度的大小相等
b. 某个维度 一个张量有,一个张量没有
c.某个维度 一个张量有,一个张量也有但大小是1
如下举例:
x=torch.empty(5,3,4,1)
y=torch.empty( 3,1,1)
如上面代码中,首先将两个张量维度向右靠齐,从右往左看,两个张量第四维大小相等,都为1,满足上面条件a;第三个维度大小不相等,但第二个张量第三维大小为1,满足上面条件b;第二个维度大小相等都为3,满足上面条件a;第一个维度第一个张量有,第二个张量没有,满足上面条件b,因此两个张量每个维度都符合上面广播条件,因此可以进行广播。
两个张量维度从右往左看,如果出现两个张量在某个维度位置上面,维度大小不相等,且两个维度大小没有一个是1,那么这两个张量一定不能进行广播。
4. 当两个张量满足可广播条件后
具体怎么进行广播
x=torch.empty(5,3,4,1)
y=torch.empty( 3,1,1)
如上面代码所示:
a. 首先第一步,将上面条件b的类型变成条件c的类型,也即是把第二个张量在缺失维度的位置上新增一个维度,维度大小为1,新增的维度如下面所示。
统一前:
x=torch.empty(5,3,4,1)
y=torch.empty( 3,1,1)
统一后:
x=torch.empty(5,3,4,1)
y=torch.empty(1,3,1,1)
b. 第二步,x、y对应维度不等的位置,把size为1的维度会被广播得和对应维度一样大,比如y中0维的1会变成5,y中2维的1会变成4,最后两个张量的维度大小变成一样,然后再进行张量运算,转变的维度如下所示。
统一前:
x=torch.empty(5,3,4,1)
y=torch.empty(1,3,1,1)
统一后:
x=torch.empty(5,3,4,1)
y=torch.empty(5,3,4,1)
5. 从空间上理解广播机制
5.1 一维张量进行广播,b被自动广播得和a一样的维度大小,完成了张量相乘运算,如下图所示。
a = torch.tensor([1,2,3])
b = torch.tensor([2])
c = a*b
a,a.shape,b,b.shape,c,c.shape
输出结果如下:
(tensor([1, 2, 3]),
torch.Size([3]),
tensor([2]),
torch.Size([1]),
tensor([2, 4, 6]),
torch.Size([3]))
5.1 二维张量进行广播,b被自动广播得和a一样的维度大小,完成了张量相加运算,如下图所示。
a = torch.tensor([[0],[10],[20],[30]])
b = torch.tensor([1,2,3])
c = a+b
a,a.shape,b,b.shape,c,c.shape
输出结果如下:
(tensor([[ 0],
[10],
[20],
[30]]),
torch.Size([4, 1]),
tensor([1, 2, 3]),
torch.Size([3]),
tensor([[ 1, 2, 3],
[11, 12, 13],
[21, 22, 23],
[31, 32, 33]]),
torch.Size([4, 3]))
上面二维张量和一维张量相加运算进行广播过程为:a的形状是(4,1),b的形状是(3),如果a和b要匹配上,第一步给b新添一个维度,我们有:a的形状是(4,1),b的形状是(1,3);第二步二者各自把为1的维度进行广播,就如上图中那样进行广播,最后运算完成。
来源:https://blog.csdn.net/flyingluohaipeng/article/details/125107959


猜你喜欢
- Oracle的show processlistset linesize 400;set pagesize 400;col sql_text
- 一、前言python在数组中随机取值有现成的方法,但是要给每个随机值被取到的概率加权重的话,可以参考下面这个方法二、实现方式import r
- 比如代码 binfo = {'name':'jay','age':20,'pytho
- 比如说点的是图片的左边,还是右边,上边还是下边?点击图片左右显示上下张,我怎么知道?这样就可以做出像QQ空间那样,打开上一个图片和下一个图片
- 前言之前使用 vue2.x + webpack3.x 撸了一个 vue 单页脚手架vue 版 spa 脚手架 有兴趣的同学可以看下,内附详细
- 本文实例讲述了Ubuntu下使用Python实现游戏制作中的切分图片功能。分享给大家供大家参考,具体如下:why拿到一个人物行走的素材,要用
- 今天展示一个利用pandas将json数据导入excel例子,主要利用的是pandas里的read_json函数将json数据转化为data
- 前言在用python处理表格数据中,这其中的工作重点就是对表格类型的数据进行梳理、计算和展示,本文重点介绍展示这个方面的工作。首先我们看一个
- 有的小伙伴对于枚举的理解很模糊,其实我们可以把它看成一个数量的大管家,对其中的每一个数进行检查,保证里面的数字都没有重复的,这就是枚举的用法
- 本文不涉及分类器、训练识别器等算法原理,仅包含对其应用(未来我也会写自己对机器学习算法原理的一些观点和了解)首先我们需要知道的是利用现有框架
- 升级到第二版,开一贴以示庆贺,哈哈哈 自 Ver1.1 升级内容 1. 增加函数列表 2. 增加函数
- pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称。这样内部数据抽取既可以用
- 概述在进行TCP Socket开发时,都需要处理数据包粘包和分包的情况。本文详细讲解解决该问题的步骤。使用的语言是Python。实际上解决该
- 使用gorm.Model后无法查询数据Scan error on column index 1, name “created_at”提示:S
- 说明:关于类的这部分,我参考了《Learning Python》一书的讲解。创建类创建类的方法比较简单,如下:class Person:&n
- Windows 10 x64macOS Sierra 10.12.4Python 2.7准备好装哔~了么,来吧,做个真正意义上的绿色小软件W
- 发现问题今天在使用ImageTk.photoImage()显示图片时,当把包含该函数放在自定义函数里时,不能正常显示,移到函数为又可正常显示
- 反向传递法则是深度学习中最为重要的一部分,torch中的backward可以对计算图中的梯度进行计算和累积这里通过一段程序来演示基本的bac
- 很多网站在注册时除了需要用户填写用户名与密码之外,还会要求用户输入邮箱,而且是属于那种不填写就不能完成注册的强制型的。碰到这种情况的时候,一
- 1、登录页登录成功时将服务端返回的标识存放起来2、在router中给不需要登录的页面设置 meta : { auth : false },如