pytorch广播机制的理解

import torch
a=torch.tensor([[[1,2]],[[3,4]]])
print(a.shape)
b=torch.tensor([[[7],[8]],[[9],[10]]])
print(b.shape)
c=a-b
print©
print(c.shape) 请用广播机制解释此代码
在这段代码中,a 和 b 的原始形状分别是 (2, 1, 2) 和 (2, 2, 1)。因为他们形状不同,所以在计算 c=a-b 时,对 a 和 b 进行广播以进行元素级别的减法运算。

广播机制工作流程如下:

广播规则首先会匹配两个张量的维度数。如果张量的维度数不同,较小维度的张量会在左边补1,直到两个张量的维度数相等。然而在这段代码中,a 和 b 的维度数都是3,所以无需进行此步骤。

接下来,PyTorch会逐个比较这两个张量的每个维度。三个不同维度的情况如下:

对于第一维度(2,2),a 和 b 在该维度上尺寸相同,不需要广播。
对于第二维度(1,2)a 的尺寸为1,b 的尺寸为2。由于 a 在该维度上的尺寸为1,根据广播规则,a 在第二维度上扩展,以匹配 b 的尺寸2。
对于第三维度(2,1),a 的尺寸为2,b 的尺寸为1。由于 b 在该维度上的尺寸为1,根据广播规则,b 在第三维度上扩展,以匹配 a 的尺寸2。
根据广播规则,a 和 b 在执行减法操作之前,先被扩展为相同的形状 (2, 2, 2)。所以,张量 c 的形状也是 (2, 2, 2)。

这就是你的代码的广播机制的解释。

那拓展为形状 (2, 2, 2)的a和b什么样子
在你给出的代码中,张量 a 和 b 通过广播变为 (2,2,2) 形状后如下:

张量 a 的原始形状是 (2,1,2):

python
复制代码

a = torch.tensor([[[1,2]],[[3,4]]])
经过广播后,张量 a 变为:

python
复制代码

a_broadcasted = tensor([[[1, 2],
[1, 2]],

                    [[3, 4],
                     [3, 4]]])

张量 b 的原始形状是 (2,2,1):

python
复制代码

b = torch.tensor([[[7],[8]],[[9],[10]]])
经过广播后,张量 b 变为:

python
复制代码

b_broadcasted = tensor([[[ 7, 7],
[ 8, 8]],

                    [[ 9,  9],
                     [10, 10]]])

注意:在实践中,广播并不会显式地创建这些扩展的副本,因为那样可能会占用大量内存。广播只是在计算过程中有效地使用这些“复制”的值,而不会实际在内存中复制。以上的 a_broadcasted 和 b_broadcasted 只是为了解释广播机制而显示的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值