【深度学习】张量的广播专题

news2024/11/25 12:59:22

一、说明

        张量广播(tensor broadcasting)是一种将低维张量自动转化为高维张量的技术,使得张量之间可以进行基于元素的运算(如加、减、乘等)。在进行张量广播时,会将维度数较少的张量沿着长度为1的轴进行复制,在匹配维度后,两个张量就可以进行运算。

二、张量的基本概念

        当较小的张量被“拉伸”以具有与较大张量的兼容形状以执行操作时,就会发生广播。

 

广播可以成为执行张量运算而不创建重复数据的有效方法。

根据 PyTorch 的说法,在以下情况下,张量是“可广播的”:

每个张量至少有一个维度

循环访问维度大小时,从尾随维度开始,维度大小必须相等、其中一个为 1,或者其中一个不存在

比较形状时,尾随维度是最右边的数字。

在上图中,可以看到通用过程:

1. 确定最右侧的尺寸是否兼容

  • 每个张量是否至少有一个维度?
  • 大小相等吗?其中之一吗?一个不存在吗?

2. 将尺寸拉伸到适当的尺寸

3. 对下一个维度重复上述步骤

这些步骤可以在下面的示例中看到。

三、元素级操作

        所有元素级运算都要求张量具有相同的形状。

3.1 矢量和标量示例

import torch
a = torch.tensor([1, 2, 3])
b = 2 # becomes ([2, 2, 2])

a * b
tensor([2, 4, 6])

        在此示例中,标量的形状为 (1,),矢量的形状为 (3,)。如图所示,b被广播为(3,)的形状,并且Hadamard乘积按预期执行。

3.2 矩阵和矢量示例 1

 

        在此示例中,A 的形状为 (3, 3),的形状为 (3,)。

发生乘法时,向量被逐行拉伸以创建一个矩阵,如上图所示。现在,A 和 b 的形状均为 (3, 3)。

        这可以在下面看到。


A = torch.tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

b = torch.tensor([1, 2, 3])

A * b
tensor([[ 1,  4,  9],
        [ 4, 10, 18],
        [ 7, 16, 27]])

3.3 矩阵和矢量示例 2

 

        在此示例中,的形状为 (3, 3),的形状为 (3, 1)。

        发生乘法时,向量将逐列拉伸以创建两个额外的列,如上图所示。现在,A 和 b 的形状均为 (3, 3)。

A = torch.tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

b = torch.tensor([[1], 
                  [2], 
                  [3]])
A * b
tensor([[ 1,  2,  3],
        [ 8, 10, 12],
        [21, 24, 27]])

Tensor and Vector Example

         在此示例中,是形状为 (2, 3, 3) 的张量,是形状为 (3, 1) 的列向量。

A = (2, 3, 3)
b = ( , 3, 1)

        从最右边的维度开始,每个元素按列拉伸以生成 (3, 3) 矩阵。中间维度相等。在这一点上,b只是一个矩阵。最左侧的维度不存在,因此必须添加一个维度。然后,必须广播矩阵以创建 (2, 3, 3) 的大小。现在有两个 (3, 3) 个矩阵,可以在上图中看到。

        这允许计算 Hadamard 乘积并生成 (2, 3, 3) 矩阵:

A = torch.tensor([[[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],

                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])

b = torch.tensor([[1], 
                  [2], 
                  [3]])

A * b
tensor([[[ 1,  2,  3],
         [ 8, 10, 12],
         [21, 24, 27]],

        [[ 1,  2,  3],
         [ 8, 10, 12],
         [21, 24, 27]]])

3.4 张量和矩阵示例

        在此示例中,是形状为 (2, 3, 3) 的张量,是形状为 (3, 3) 的矩阵。

A = (2, 3, 3)
B = ( , 3, 3)

        此示例比上一个示例更容易,因为最右侧的两个维度是相同的。这意味着矩阵只需在最左侧的维度上广播即可创建 (2, 3, 3) 的形状。这只是意味着需要一个额外的矩阵。

        计算哈达玛乘积时,结果为 (2, 3, 3)。

A = torch.tensor([[[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],
                   
                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])

B = torch.tensor([[1, 2, 3], 
                  [1, 2, 3], 
                  [1, 2, 3]])

A * B
tensor([[[ 1,  4,  9],
         [ 4, 10, 18],
         [ 7, 16, 27]],

        [[ 1,  4,  9],
         [ 4, 10, 18],
         [ 7, 16, 27]]])

四、矩阵和张量乘法与点积

        对于前面的所有示例,目标是以相同的形状结束,以允许逐元素乘法。此示例的目标是通过点积实现矩阵和张量乘法,这需要第一个矩阵或张量的最后一个维度与第二个矩阵或张量的倒数第二个维度匹配。

        对于矩阵乘法:

  • (m, n) x (n, r) = (c, m, r)

        对于 3D 张量乘法:

  • (c, m, n) x (c, n, r) = (c, m, r)

对于 4D 张量乘法:

  • (z, c, m, n) x (z, c, n, r) = (z, c, m, r)

        对于此示例,A 的形状为 (2, 3, 3),的形状为 (3, 2)。截至目前,最后两个维度符合点积乘法的条件。需要将维度添加到 B,并且需要跨此维度广播 (3, 2) 矩阵以创建 (2, 3, 2) 的形状。

        此张量乘法的结果将是 (2, 3, 3) x (2, 3, 2) = (2, 3, 2)。

A = torch.tensor([[[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],
                   
                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])

B = torch.tensor([[1, 2], 
                  [1, 2], 
                  [1, 2]])

A @ B # A.matmul(B)
tensor([[[ 6, 12],
         [15, 30],
         [24, 48]],

        [[ 6, 12],
         [15, 30],
         [24, 48]]])

        有关广播的其他信息可以在下面的链接中找到。有关张量及其操作的更多信息可以在此处找到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)

目录 选择排序 思路图解 代码&#xff08;C语言&#xff09; 时间复杂度 堆排序 算法1 算法2 堆排序代码 选择排序 思路图解 代码&#xff08;C语言&#xff09; void Selection_Sort(ElementType A[], int N) {for(i 0; i < N; i){MinPosition ScanForMin(A,i,N…

【CSS】 position : static | absolute | relative | fixed | sticky

目录 1️⃣前言2️⃣内容2.1、什么是定位&#xff1f;2.2、为什么需要定位&#xff1f;2.3、如何使用定位&#xff1f;2.3.1、定位的组成2.3.2、static2.3.3、relative2.3.4、absolute2.3.5、fixed2.3.6、sticky 2.4、什么是 z-index &#xff1f;2.5、z-index 属性的取值2.6、…

Docker本地镜像发布到阿里云

我们构建了自己的镜像后&#xff0c;可以发布到远程镜像提供给其他人使用&#xff0c;比如发布到阿里云 使用build/commit生成新的镜像&#xff0c;并生成自己镜像的版本标签tag&#xff0c;此新的镜像在自己的本地库中&#xff0c;使用push可以将镜像提交到阿里云公有库/私有库…

阿里云推出“ModelScopeGPT”大模型调用工具,再添新贵

阿里云近日对外宣布将要推出其首款大模型调用工具——“魔搭GPT&#xff08;ModelScopeGPT&#xff09;”&#xff0c;从而为使用者们提供更为优质的人工智能应用支持。而作为阿里云人工智能产品家族中的新成员&#xff0c;这一创新工具也将进一步扩展阿里云在人工智能领域的影…

对抗网络GAN详解:GAN训练不稳定解决方法、GAN中使用的深度学习技巧、GAN使用任务领域、GAN资料大全整理

不建议用博弈论思想 (game theory) 去理解对抗网络&#xff0c;减弱生成器 G 与判别器 D 间的对抗属性有利于稳定训练。不要把判别器理解成一个分类器 (Discriminator, Classifier)&#xff0c;让判别器回归判别属性&#xff0c;像 Critic 那样输出一个评分。这样能让判别器为生…

总结SPI、I2C、UART三者的区别以及有关知识

SPI&#xff08;串行外设接口&#xff09;&#xff0c;I2C&#xff08;串行总线接口&#xff09;和UART&#xff08;通用异步收发器&#xff09;是三种常用的通信协议&#xff0c;用于在不同的设备之间进行数据传输。 目录 三者的区别&#xff1a; 单工&#xff0c;半双工&am…

windows10 搭建hadoop环境,并且使用hadoop命令

hadoop 环境创建 1. 八、window搭建spark IDEA开发环境 按照步骤安装完 2. windows下安装和配置hadoop 配置环境变量&#xff0c;注意JAVA_HOME路径&#xff0c;修改后&#xff0c;重启电脑&#xff0c;不重启容易报错&#xff01;&#xff01;&#xff01; ​ 新建dat…

Kubernetes - kubeadm部署

Kubernetes - kubeadm部署 1 环境准备1.1 在各个节点上配置主机名&#xff0c;并配置 Hosts 文件1.2 关闭防护墙&#xff0c;禁用selinux&#xff0c;关闭swap1.3 配置免密登录1.4 配置内核参数1.5 配置br_netfilter 2. 安装K8s2.1 安装docker(各节点)2.2 安装K8s组件(各节点)2…

泛型和Object类的区别

文章目录 使用的时机为什么集合类要是用泛型而不用Object如何将List< Object >aa转成List< User >bb使用泛型的好处&#xff1a;泛型标记符 使用的时机 泛型&#xff1a;如果我确定要用哪个对象&#xff0c;并且使用到这个对象里面的属性&#xff0c;选择用泛型&a…

疯狂数据结构-栈-Java

概念 基本概念解读 当谈到 "栈" 时&#xff0c;它是一种遵循后进先出&#xff08;Last In, First Out&#xff0c;LIFO&#xff09;原则 的有序集合。这意味着最后入栈的元素首先被弹出&#xff0c;而最早入栈的元素最后被弹 出。 在栈中&#xff0c;只能对最上面的…

物联网(IoT):连接未来的万物之网

引言&#xff1a; 物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过各种智能设备和传感器&#xff0c;使物体能够互联互通、收集和共享数据的网络。随着科技的不断进步和智能设备的普及&#xff0c;物联网的应用呈现出爆发式增长&#xff0c;对各…

【文末送书 - 数据分析之pandas篇④】- DataFrame数据合并

向阳花花花花 - 个人主页 迄今所有人生都大写着失败&#xff0c;但并不妨碍我继续向前 Python 数据分析专栏 正在火热更新中 &#x1f525; 文章目录 一、concat二、append三、merge3.1 没有属性相同时3.2 只有一个属性相同时1.一对一合并2.一对多合并3.多对多合并 3.3 有多个…

爬楼梯,假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

题记&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例…

mysql开启binlog并配置定期删除以及文件大小,删库跑路之数据恢复

一、开启并binlog日志并配置 1、配置文件 [mysqld] #设置3306端口 port 3306 # 设置mysql的安装目录 basedirC:\\JJS\\software\\mysql-5.7.41-winx64\\mysql-5.7.41-winx64 # 允许最大连接数 max_connections200 # 服务端使用的字符集默认为8比特编码的latin1字符集 chara…

Vue前端生成UUID

基础使用 当使用Vue.js生成UUID时&#xff0c;我们可以使用 uuid 库来帮助我们生成通用唯一标识符&#xff08;UUID&#xff09;。UUID是一个128位的唯一标识符&#xff0c;它可以用于唯一标识对象、实体或数据。 以下是在Vue.js中生成UUID的详细步骤&#xff1a; 首先&…

SpringBoot——自动装配之@Import

文章目录 前言ImportImport 的作用1、Import(MyDemo1.class) 将某个对象加载至bean容器中2、Import一个类 该类实现了ImportSelector, 重写selectImports方法该方法返回了String[]数组的对象&#xff0c;数组里面的类都会注入到spring容器当中3、Import一个类&#xff0c;该类实…

Premiere Pro 2023(23.5) Mac

Premiere Pro是一个业界领先的视频编辑软件&#xff0c;旨在帮助用户快速、高效地制作和编辑专业质量的视频内容。作为Creative Cloud套装中的一部分&#xff0c;Premiere Pro具有丰富的功能和工具&#xff0c;可应对各种视频编辑需求。 Premiere Pro的主要特点包括多个视频和音…

Unity游戏源码分享-Unity版本的经典斗地主游戏完整源码

Unity游戏源码分享-Unity版本的经典斗地主游戏完整源码 工程地址&#xff1a; https://download.csdn.net/download/Highning0007/88057828

css+js实现点击特效效果

话不多说&#xff0c;先上效果图 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

详细进行wrnchAI 与OpenPose 的姿势检测估计系统的各项性能比较

本文将对wrnchAI 与OpenPose的性能进行比较。我们评估了人体姿势估计系统,并通过比较 wrnchAI 与 OpenPose 的以下参数来报告我们的发现: 准确性运算速度系统要求型号尺寸其他特性 移动支持跟踪支持。绿屏分割。支持应用程序开发。许可易于设置和使用披露:我们从 wrnch 收…