pytorch中的广播语义
作者:机器学习入坑者 发布时间:2023-04-22 15:16:36
pytorch的广播语义(broadcasting semantics),和numpy的很像,所以可以先看看numpy的文档:
1、什么是广播语义?
官方文档有这样一个解释:
In short, if a PyTorch operation supports broadcast, then its Tensor arguments can be automatically expanded to be of equal sizes (without making copies of the data).
这句话的意思大概是:简单的说,如果一个pytorch操作支持广播,那么它的Tensor参数可以自动的扩展为相同的尺寸(不需要复制数据)。
按照我的理解,应该是指算法计算过程中,不同的Tensor如果size
不同,但是符合一定的规则,那么可以自动的进行维度扩展,来实现Tensor
的计算。在维度扩展的过程中,并不是真的把维度小的Tensor复制为和维度大的Tensor相同,因为这样太浪费内存了。
2、广播语义的规则
首先来看标准的情况,两个Tensor的size相同,则可以直接计算:
x = torch.empty((4, 2, 3))
y = torch.empty((4, 2, 3))
print((x+y).size())
输出:
torch.Size([4, 2, 3])
但是,如果两个Tensor
的维度并不相同,pytorch也是可以根据下面的两个法则进行计算:
(1)Each tensor has at least one dimension.
(2)When iterating over the dimension sizes, starting at the trailing dimension, the dimension sizes must either be equal, one of them is 1, or one of them does not exist.
每个
Tensor
至少有一个维度。迭代标注尺寸时,从后面的标注开始
第一个规则要求每个参与计算的Tensor
至少有一个维度,第二个规则是指在维度迭代时,从最后一个维度开始,可以有三种情况:
维度相等
其中一个维度是1
其中一个维度不存在
3、不符合广播语义的例子
x = torch.empty((0, ))
y = torch.empty((2, 3))
print((x + y).size())
输出:
RuntimeError: The size of tensor a (0) must match the size of tensor b (3) at non-singleton dimension 1
这里,不满足第一个规则“每个参与计算的Tensor
至少有一个维度”。
x = torch.empty(5, 2, 4, 1)
y = torch.empty(3, 1, 1)
print((x + y).size())
输出:
RuntimeError: The size of tensor a (2) must match
the size of tensor b (3) at non-singleton dimension 1
这里,不满足第二个规则,因为从最后的维度开始迭代的过程中,倒数第三个维度:x是2,y是3。这并不符合第二条规则的三种情况,所以不能使用广播语义。
4、符合广播语义的例子
x = torch.empty(5, 3, 4, 1)
y = torch.empty(3, 1, 1)
print((x + y).size())
输出:
torch.Size([5, 3, 4, 1])
x是四维的,y是三维的,从最后一个维度开始迭代:
最后一维:x是1,y是1,满足规则二
倒数第二维:x是4,y是1,满足规则二
倒数第三维:x是3,y是3,满足规则一
倒数第四维:x是5,y是0,满足规则一
来源:https://zhuanlan.zhihu.com/p/338298069


猜你喜欢
- 【导语】:对自己写的冗长代码,想重构但又无思路?小编整理了系列介绍python代码重构优化的方法,助你一臂之力。编写干净的 Pythonic
- 本文实例讲述了JS实现淘宝支付宝网站的控制台菜单效果。分享给大家供大家参考。具体如下:这是一款支付宝网站中的控制台总菜单,可实现动画效果的显
- 全局,动态,默认值-1表示自动调整大小,公式:8 + (max_connections / 100)。最小值0,最大值16384,查看当前:
- 一、安装前的准备1、下载安装程序包,可到MySQL官方网站www.mysql.com下载,如图1-1:图1-1下载后的安装文件如图1-2所示
- 使用go mod之后,想要在goland中有代码提示,有两种方式,一种是使用gopath下的goimport工具,另一种是使用gomod自身
- Python 运算符通常用于对值和变量执行操作。这些是用于逻辑和算术运算的标准符号。在本文中,我们将研究不同类型的 Python 运算符。&
- 作为面向对象编程中实现控制反转(Inversion of Control,下文称IoC)最常见的技术手段之一,依赖注入(Dependency
- 本文实例为大家分享了JavaScript实现简易放大镜的具体代码,供大家参考,具体内容如下完整代码:<!DOCTYPE html>
- 听到一些人说现在做产品设计很没有成就感。没有什么创造力,除了抄袭模仿(称之为竞争分析)、千篇一律(又称规范标准)还有复杂的流程、粗制滥造的表
- 1、Matplotlib 简介Matplotlib 简介:Matplotlib 是一个python的 2D绘图库,它以各种硬拷贝格式和跨平台
- 写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类。这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案
- 本文实例为大家分享了原生js实现波浪导航效果的具体代码,供大家参考,具体内容如下展示效果:源码展示:<!doctype html>
- MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDATE语法,使得原本需要执行3条SQL语句(SE
- 众所周知当前(甚至接下来的几年)最酷的东西是iPhone。不仅仅是因为iPhone看起来不错,它们在网站方面也很不错。而且,更重要的是,很多
- 前言一直都觉得vue的插件生涩难懂,但是又很好奇,在看了几篇文章,试着写了写之后觉得也没那么难,本文主要实现一个简单的Toast插件,方便迁
- 废话不多说,直接上代码吧!#python中,while语句用于循环执行程序,即在某个条件下,循环执行某段程序,以处理需要重复处理的相同任务。
- 本文实例讲述了python实现根据图标提取分类应用程序,分享给大家供大家参考。具体方法如下:#!/usr/bin/python # -*-
- hasattr(object, name)作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(oj
- 一、事务 mysql事务是用于处理操作量大、复杂性高的数据1. 事务特性
- 这篇文章主要介绍了Python Selenium参数配置方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值