Pytorch中的广播机制详解(Broadcast)

 更新时间:2023年01月03日 09:51:50   作者:cv_lhp  
这篇文章主要介绍了Pytorch中的广播机制详解(Broadcast),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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的维度进行广播,就如上图中那样进行广播,最后运算完成。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 用Python实现群发邮件

    用Python实现群发邮件

    大家好,本篇文章主要讲的是用Python实现群发邮件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • python实现H2O中的随机森林算法介绍及其项目实战

    python实现H2O中的随机森林算法介绍及其项目实战

    这篇文章主要介绍了python实现H2O中的随机森林算法介绍及其项目实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Python实现随机游走的示例代码

    Python实现随机游走的示例代码

    随机游走是一个数学对象,称为随机或随机过程,它描述了一条路径,该路径由一些数学空间上的一系列随机步骤组成,下面我们就来学习一下Python如何实现随机游走的吧
    2023-12-12
  • python解决OpenCV在读取显示图片的时候闪退的问题

    python解决OpenCV在读取显示图片的时候闪退的问题

    这篇文章主要介绍了python解决OpenCV在读取显示图片的时候闪退的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 利用PyQT5日期控件制作一个小日历

    利用PyQT5日期控件制作一个小日历

    这篇文章主要介绍了利用PyQT5的日期控件制作一个小日历,因为pyqt5已经自带了相关的日期控件,只需要明白如何调用再加上比较个性化的功能,这个日历的小控件就制作完成了。需要的可以参考一下
    2022-01-01
  • Python使用tkinter实现摇骰子小游戏功能的代码

    Python使用tkinter实现摇骰子小游戏功能的代码

    这篇文章主要介绍了Python使用tkinter实现的摇骰子小游戏功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • python实现将两个文件夹合并至另一个文件夹(制作数据集)

    python实现将两个文件夹合并至另一个文件夹(制作数据集)

    这篇文章主要介绍了python实现将两个文件夹合并至另一个文件夹(制作数据集),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python实现差分隐私Laplace机制详解

    python实现差分隐私Laplace机制详解

    今天小编就为大家分享一篇python实现差分隐私Laplace机制详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python中如何使用正则表达式的集合字符示例

    python中如何使用正则表达式的集合字符示例

    我们都知道,正则表达式可以很方便地对字符串进行匹配、查找、分割等操作,下面这篇文章主要给大家介绍了关于python中如何使用正则表达式的集合字符的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下。
    2017-10-10
  • Python使用MD5加密算法对字符串进行加密操作示例

    Python使用MD5加密算法对字符串进行加密操作示例

    这篇文章主要介绍了Python使用MD5加密算法对字符串进行加密操作,结合实例形式分析了Python实现md5加密相关操作技巧,需要的朋友可以参考下
    2018-03-03

最新评论