Pytorch教程(十五):element-wise、Broadcasting

t1 = torch.tensor([
    [1,2],
    [3,4]
], dtype=torch.float32)
t2 = torch.tensor([
    [9,8],
    [7,6]
], dtype=torch.float32)

我们先创建了两个秩为2,形状为 2 × 2 2 \times 2 2×2的张量,这意味着我们有两个轴,他们都有两个元素的长度,第一个轴的元素是数组,第二个轴的元素是数字。

在这里插入图片描述
两个张量必须具有相同数量的元素才能执行一个element-wise操作。也就是说两个张量必须具有相同的形状才能执行一个元素操作,具有相同的形状意味着每一个对应的轴上有相同数量的轴,并且他们的长度相同。

在这里插入图片描述
在相应位置的每一对元素被加在一起,产生一个具有相同形状的新张量,所以加法是一个element-wise运算。所有其他的算数运算,比如减法、乘法、除法也是元素运算。

我们通常用张量看到的运算是使用标量值的算数运算,而下面这些例子打破了我们建立的规则,即元素的操作需要在张量有相同的形状的前提下进行,所有的标量值都是零阶张量,这就意味着他们没有形状,我们的张量t1是一个 2 × 2 2 \times 2 2×2的二阶张量,那么这时如何调整的呢?
在这里插入图片描述

可能想到的第一个解决方案是,操作只是简单地使用单个标量值,并对一个张量中的每个元素进行操作,这种逻辑是可行的,然而这有点误导人,它打破了一个更普遍的情况,即我们没有使用标量的情况,要以不同的方式来思考这些操作,我们需要引入张量广播的概念。

广播定义了在元素操作过程中如何处理不同形状的张量。

我们重新考虑一下t1+2运算,标量张量被扩展到张量t1的形状,然后进行元素运算,通过对numpy函数的广播,我们可以看到在标量值上的广播是什么样子:
在这里插入图片描述

下面看一个稍微复杂一点的情况:
在这里插入图片描述

即使这些张量有不同的shape,但依然可以相加,这正是得益于广播机制,较低的秩向量t2将通过广播进行转换,以匹配更高阶张量t1的形状,而元素将像往常一样执行。我们可以使用广播到numpy函数来检查广播转换,然后运行操作:
在这里插入图片描述
可以看出t2被广播成了shape为 2 × 2 2 \times 2 2×2的tensor,这样t1 + t2就是相同shape之间的操作。而这就是torch内部自动帮我们做的,我们无需手动执行广播。

Guess you like

Origin blog.csdn.net/vincent_duan/article/details/120616345