8

pytorch笔记:张量的广播机制

 2 years ago
source link: https://gsy00517.github.io/pytorch20200228111430/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
pytorch笔记:张量的广播机制 | 高深远的博客

pytorch笔记:张量的广播机制

发表于 2020-02-28 | 更新于: 2020-02-29 | 分类于 程序与设计 | 0 | 阅读次数:
字数统计: 725字 | 阅读时长 ≈ 2分钟

在pytorch的张量计算中,“广播”指的是当满足一定条件时,较小的张量能够自动扩张成合适尺寸的大张量,使得能够进行计算。

References

电子文献:
https://pytorch.org/docs/stable/notes/broadcasting.html

当一对张量满足下面的条件时,它们才是可以被“广播”的。

  1. 每个张量至少有一个维度。
  2. 迭代维度尺寸时,从尾部(也就是从后往前)开始,依次每个维度的尺寸必须满足以下之一:
    • 相等
    • 其中一个张量的维度尺寸为1
    • 其中一个张量不存在这个维度。

光看条件可能会有点迷,下面是官方文档中的几个例子。

import torch

首先,显然相同形状的张量是可以广播的(或者说不需要广播)。

x = torch.empty(5, 7, 3)
y = torch.empty(5, 7, 3)

(x+y).size()输出torch.Size([5, 7, 3])
一般而言,我们可以从后往前分析一对张量是不是“broadcastable”。

x = torch.empty(5, 3, 4, 1)
y = torch.empty( 3, 1, 1)

我们依次分析:
对倒数第一个维度,两者尺寸相同,符合“相等”的条件。
对倒数第二个维度,y的尺寸为1,符合“其中一个张量尺寸为1”的条件。
对倒数第三个维度,两者尺寸相同,符合“相等”的条件。
对倒数第四个维度,y的该维度不存在,符合“其中一个张量不存在这个维度”的条件。
综上,这两个张量可以广播。
其实,x可以比y多出更多的维度,都满足该维度有“其中一个张量不存在这个维度”的条件。
举个反例:

x = torch.empty(5, 2, 4, 1)
y = torch.empty( 3, 1, 1)

这里若x+y就无法广播了,因为从后往前遇到倒数第三个维度时会被卡住,不满足任何一个条件。
此外,对torch.empty((0,)),它也无法和其他任何张量广播,可以输出发现其结果为tensor([]),是空的,这就不满足“每个张量至少有一个维度”这个条件。


tensor.view()

这里做个补充,一般我们在全连接层,总是会看到对某个张量作view(-1, ...)的变换,其实这里的“-1”并不是直接表示尺寸,而是起到让计算机帮助自动计算的功能。
举个例子,比如一个tensor含有6个数据(无论唯独尺寸如何组合),我们对其view(-1, 2),那么输出的尺寸就是[3, 2],若view(-1),那么输出的尺寸就是[6]。
注意,不能同时出现两个“-1”让机器计算。虽然在某些情况下,人能够判断,比如含有6个数据的tensor我们能够想到view(-1, -1, 6)输出尺寸是[1, 1, 6],但机器就会认为这是个错误。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK