动手学深度学习——数据操作之广播机制

本文介绍了张量的概念,它在深度学习中相当于数组,矩阵和向量是其特例。文章阐述了按元素操作,即相同形状的张量进行加减运算时,其实是各元素间的运算。接着解释了广播机制,允许形状不同的张量在特定条件下执行按元素操作,通过扩展张量来匹配形状。最后,提供了广播机制触发的两种情况,并举例说明了广播在形状不匹配时如何工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看这篇文章之前,首先你需要知道什么是 张量

别被这个高逼格的名字唬住,其实张量就是我们常说的 数组 ,在数学、物理领域的称呼,n维的数组就可以称为n阶张量。所以矩阵也可以叫二阶张量,向量则是一阶张量,就连标量也可以用零阶张量来称呼。

知道了张量这个概念后,(你就可以出去小装一下了,开玩笑啦😂),我们简单聊聊为什么深度学习的文章当中很多都是用张量来称呼数组,这很大程度上受影响于pytorch等框架使用的对象是tensor,直译过来就叫张量,而numpy模块里的array直译过来就是数组,二者的操作没有什么区别,tensor的属性和方法也就是继承自ndarray

什么是按元素操作

当两个张量形状相同时,张量间的 加减运算 实质是张量内的每个元素在进行加减运算,即按元素操作;
同样,当张量与常量进行的 加减乘除 也是张量内的每个元素被进行加减乘除运算,即按元素操作;


什么是广播机制

在某些情况下,即使两个张量的形状不同,我们仍然可以通过调用 广播机制:broadcasting mechanism 来执行按元素操作。 这种机制的工作方式如下:首先,通过适当复制元素来扩展一个或两个张量, 以便在转换之后,两个张量具有相同的形状。 其次,对生成的张量执行按元素操作。

说明:

  • Numpy的数组(也可称作张量)ndarray和PyTorch的张量tensor在使用方法上没有区别,广播机制实质是是从Numpy传入PyTorch框架

在大多数情况下,我们将沿着数组中长度为1的轴进行广播,如下例子:

a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b

结果:(tensor([[0],
         [1],
         [2]]),
     tensor([[0, 1]]))

由于a和b分别是 3×1 和 1×2 矩阵,如果让它们相加,它们的形状不匹配。 我们将两个矩阵广播为一个更大的 3×2 矩阵,如下所示:矩阵a将复制列变为2, 矩阵b将复制行变为3,然后再按元素相加。

a + b

结果:tensor([[0, 1],
        [1, 2],
        [2, 3]])

上述的结果,就是由张量:tensor([[0, 0],[1, 1],[2, 2]]) 与张量:tensor([[0, 1],[0, 1],[0, 1]]) 相加而得。

值得注意的是,张量间的乘除运算不会触发广播,因为这两种运算不是元素操作。


如何触发广播机制

广播主要发生在两种情况:

  • 一种是两个张量的维度(阶数)不相等,但是它们的后缘维度的轴长相符
    二维张量与一维张量运算

三维张量与二维张量运算

  • 另外一种是有一方的某一维度的轴长为1

二维张量间的运算

常量与张量的运算也是元素操作,也触发了广播机制。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值