深度学习中的张量 - 使用PyTorch进行广播和元素级操作

深度学习中的张量 - 使用PyTorch进行广播和元素级操作

元素级是什么意思?

元素级操作在神经网络编程中与张量的使用非常常见。让我们从一个元素级操作的定义开始这次讨论。

一个_元素级_操作是在两个张量之间进行的操作,它作用于各自张量中的相应元素。

一个_元素级_操作在张量之间的相应元素上进行操作。

如果两个元素被认为在张量中占据相同的位置,那么这两个元素就被称为相应的元素。位置由用来定位每个元素的索引决定。

假设我们有以下两个张量:

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

这两个张量都是秩为2的张量,形状为2 x 2​。

这意味着我们有两个长度为二的轴。第一个轴的元素是数组,第二个轴的元素是数字。

> print(t1[0])
tensor([1., 2.])> print(t1[0][0])
tensor(1.)

这是我们现在在这个系列中用来看到的东西。好了,让我们在此基础上进一步讨论。

我们知道,如果两个元素占据张量中的相同位置,那么它们就被认为是相应的元素,位置由用来定位每个元素的索引决定。让我们看看相应元素的例子。

> t1[0][0]
tensor(1.)> t2[0][0]
tensor(9.)

这使我们能够看到,t1​中1​的相应元素是t2​中的9​。

通过索引定义的对应关系很重要,因为它揭示了元素级操作的一个重要特征。我们可以推断出,为了执行元素级操作,张量必须具有相同数量的元素。

我们将进一步限制这个陈述。为了在它们上执行元素级操作,两个张量必须具有相同的形状。

加法是一个元素级操作

让我们看看我们的第一个元素级操作,加法。别担心,它会变得更有趣。

> t1 + t2
tensor([[10., 10.],[10., 10.]])

这使我们能够看到,张量之间的加法是一个元素级操作。相应位置的每对元素都被加在一起,产生一个形状相同的新张量。

所以,加法是一个元素级操作,实际上,所有的算术操作,加、减、乘和除都是元素级操作。

算术操作是元素级操作

我们经常看到的张量操作是使用标量值的算术操作。我们可以用两种方式进行这种操作:

(1) 使用这些符号操作:

> print(t + 2)
tensor([[3., 4.],[5., 6.]])> print(t - 2)
tensor([[-1.,  0.],[ 1.,  2.]])> print(t * 2)
tensor([[2., 4.],[6., 8.]])> print(t / 2)
tensor([[0.5000, 1.0000],[1.5000, 2.0000]])

或者等效地,(2) 使用这些内置于张量对象的方法:

> print(t1.add(2))
tensor([[3., 4.],[5., 6.]])> print(t1.sub(2))
tensor([[-1.,  0.],[ 1.,  2.]])> print(t1.mul(2))
tensor([[2., 4.],[6., 8.]])> print(t1.div(2))
tensor([[0.5000, 1.0000],[1.5000, 2.0000]])

这两种选项都有效。我们可以看到,在这两种情况下,标量值2​都应用于每个元素和相应的算术操作。

这里似乎有些问题。这些例子打破了我们之前所说的元素级操作必须在形状相同的张量上进行的规则。

标量是秩为0的张量,这意味着它们没有形状,而我们的张量t1​是一个形状为2 x 2​的秩为2的张量。

那么这如何适应呢?让我们分解一下。

首先想到的解决方案可能是,操作只是使用单个标量值,并对张量中的每个元素进行操作。

这种逻辑是可行的。然而,这有点误导,当我们在更一般的情况下使用标量时,它就崩溃了。

要不同地考虑这些操作,我们需要引入_张量广播_或广播的概念。

广播张量

广播描述了在元素级操作期间如何处理形状不同的张量。

广播是一个概念,其实现允许我们将标量添加到更高维的张量。

让我们考虑t1 + 2​操作。在这里,标量值张量被广播到t1​的形状,然后执行元素级操作。

我们可以使用broadcast_to()​ NumPy函数查看广播后的标量值是什么样子:

> np.broadcast_to(2, t1.shape)
array([[2, 2],[2, 2]], dtype=float32)

这意味着标量值被转换为一个像t1​一样的秩为2的张量,就像那样,形状匹配,具有相同形状的元素级规则再次发挥作用。这当然是在幕后进行的。

这段代码在这里描绘了画面。这个

> t1 + 2
tensor([[3., 4.],[5., 6.]])

实际上是这样的:

> t1 + torch.tensor(np.broadcast_to(2, t1.shape),dtype=torch.float32
)
tensor([[3., 4.],[5., 6.]])

此时,你可能会认为这似乎很复杂,所以让我们看一个更巧妙的例子来强调这一点。假设我们有以下两个张量。

广播的更巧妙的例子

让我们看一个更巧妙的例子来强调这一点。假设我们有以下张量。

t1 = torch.tensor([[1,1],[1,1]
], dtype=torch.float32)t2 = torch.tensor([2,4], dtype=torch.float32)

这个元素级加法操作的结果会是什么?考虑到元素级操作的相同形状规则,这甚至可能吗?

> t1.shape
torch.Size([2, 2])> t2.shape
torch.Size([2])

尽管这两个张量的形状不同,元素级操作是可能的,广播是使操作成为可能的关键。秩为低的张量t2​将通过广播转换以匹配秩为高的张量t1​的形状,然后像往常一样执行元素级操作。

理解广播的概念是理解这个操作如何进行的关键。和以前一样,我们可以使用NumPy的broadcast_to()​函数检查广播转换。

> np.broadcast_to(t2.numpy(), t1.shape)
array([[2., 4.],[2., 4.]], dtype=float32)> t1 + t2
tensor([[3., 5.],[3., 5.]])

广播后,这两个张量之间的加法操作是一个形状相同的张量之间的常规元素级操作。

​​在这里插入图片描述

广播是一个比基本元素级操作更高级的话题,所以如果需要更长时间来适应这个概念,不要担心。

我们何时实际使用广播?当我们预处理数据时,尤其是进行归一化程序时,我们经常需要使用广播。

在Keras课程的TensorFlow.js部分中,有一篇文章更详细地介绍了广播。那里有一个实际的例子,并且也涵盖了确定如何广播特定张量的算法,所以请查看那篇文章,以获得关于广播的更深入讨论。

不用担心不了解TensorFlow.js。这不是一个要求,我强烈推荐那里关于广播的内容。

比较操作是元素级的

比较操作也是元素级操作。

对于两个张量之间的给定比较操作,将返回一个形状相同的新张量,每个元素包含一个torch.bool​值的True​或False​。

PyTorch 1.2.0版本中的行为变化

比较操作返回的数据类型已从torch.uint8​变更为torch.bool​(在版本21113中)。

版本1.1:

> torch.tensor([1, 2, 3]) < torch.tensor([3, 1, 2])
tensor([1, 0, 0], dtype=torch.uint8)

版本1.2:

> torch.tensor([1, 2, 3]) < torch.tensor([3, 1, 2])
tensor([True, False, False])

以下示例展示了PyTorch版本1.2.0及更高版本中的输出。

元素级比较操作示例

假设我们有以下张量:

> t = torch.tensor([[0,5,0],[6,0,7],[0,8,0]
], dtype=torch.float32)

让我们看看这些比较操作。

> t.eq(0)
tensor([[True, False, True],[False, True, False],[True, False, True]])> t.ge(0)
tensor([[True, True, True],[True, True, True],[True, True, True]])> t.gt(0)
tensor([[False, True, False],[True, False, True],[False, True, False]])> t.lt(0)
tensor([[False, False, False],[False, False, False],[False, False, False]])> t.le(7)
tensor([[True, True, True],[True, True, True],[True, False, True]])

从广播的角度考虑这些操作,我们可以看到最后一个操作t.le(7)​实际上是这样的:

> t <= torch.tensor(np.broadcast_to(7, t.shape),dtype=torch.float32
)
tensor([[True, True, True],[True, True, True],[True, False, True]])

相应地,这也可以表示为:

> t <= torch.tensor([[7,7,7],[7,7,7],[7,7,7]
], dtype=torch.float32)
tensor([[True, True, True],[True, True, True],[True, False, True]])

使用函数进行元素级操作

对于元素级操作,这些操作是函数形式的,可以假设函数被应用于张量的每个元素。

以下是一些示例:

> t.abs()
tensor([[0., 5., 0.],[6., 0., 7.],[0., 8., 0.]])> t.sqrt()
tensor([[0.0000, 2.2361, 0.0000],[2.4495, 0.0000, 2.6458],[0.0000, 2.8284, 0.0000]])> t.neg()
tensor([[-0., -5., -0.],[-6., -0., -7.],[-0., -8., -0.]])> t.neg().abs()
tensor([[0., 5., 0.],[6., 0., 7.],[0., 8., 0.]])
一些术语

还有其他一些方式来指代元素级操作,所以我只想提一下,所有这些术语都意味着相同的事情:

  • 元素级
  • 组件级
  • 点级

如果在其他地方遇到这些术语,请记住这一点。

总结

现在,我们应该对元素级操作有了很好的理解,以及它们如何应用于神经网络和深度学习的张量操作。在下一篇文章中,我们将涵盖张量操作的最后两个类别:

  • 重塑操作
  • 元素级操作
  • 归约操作
  • 访问操作

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是三高架构?

大家好&#xff0c;我是锋哥。今天分享关于【什么是三高架构?】面试题。希望对大家有帮助&#xff1b; 什么是三高架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 “三高架构”通常是指高可用性&#xff08;High Availability&#xff09;、高性能&#xff…

STL--list(双向链表)

目录 一、list 对象创建 1、默认构造函数 2、初始化列表 3、迭代器 4、全0初始化 5、全值初始化 6、拷贝构造函数 二、list 赋值操作 1、赋值 2、assign&#xff08;迭代器1&#xff0c;迭代器2&#xff09; 3、assign&#xff08;初始化列表&#xff09; 4、assig…

Vue3数据响应式原理

什么是数据响应式 当数据变化时&#xff0c;引用数据的函数&#xff08;副作用函数&#xff09;自动重新执行。 即数据触发了函数的响应&#xff0c;如&#xff1a;视图渲染中使用了某数据&#xff0c;数据改变后&#xff0c;视图跟着自动更新。 触发者&#xff1a;数据 响应者…

Spark RPC 学习总结

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff1a;https://www.captainai.net/dongkelun 前言 本文从API层面学习总结Spark RPC,暂不涉及源码分析。 Spark 通信历史 最开始: …

Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示

Ubuntu20.04默认情况下为root账号自动登录&#xff0c;本文介绍如何取消root账号自动登录&#xff0c;改为通过输入账号密码登录&#xff0c;使用触觉智能EVB3568鸿蒙开发板演示&#xff0c;搭载瑞芯微RK3568&#xff0c;四核A55处理器&#xff0c;主频2.0Ghz&#xff0c;1T算力…

C/C++内存管理(超详解)

目录 1.C/C内存分布 2.C语言动态内存管理 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 3.C动态内存管理 3.1new/delete操作内置类型 3.2new/delete操作自定义类型 3.3operator new与operator delete函数 3.4定位new表达式(placement-new) 1.C/C内存分布 内存中是如…

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令 简介 项目分析 如何执行系统命令并拿到结果 代码实现 简介 在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字&#xff0c;还实现了服务器端和客户端的通信&#xff0c;本…

AIGC视频生成模型:Meta的Emu Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video&#xff0c;作为Meta发布的第二款视频生成模型&#xff0c;在视频生成领域发挥关键作用。 &#x1f33a;优质专栏回顾&am…

IO进程----进程

进程 什么是进程 进程和程序的区别 概念&#xff1a; 程序&#xff1a;编译好的可执行文件 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 程序是静态的&#xff0c;没有任何执行的概念 进程&#xff1a;一个独立的可调度的任务 执行一个程序分配资…

flutter 使用google_mlkit_image_labeling做图片识别

在AI横行的如今&#xff0c;相信大家或多或少都做过跟AI接轨的需求了吧&#xff1f;今天我说的是关于图片识别的需求&#xff0c;flutter的专属图片识别插件google_mlkit_image_labeling。 google_mlkit_image_labeling它是Google旗下的Google Cloud Vision API中分支出来的一部…

elasticsearch基础

分布式搜索引擎01 1. 初始elasticsearch 1.1. 了解ES 1.1.1. elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在github搜索代码&#xff1a; 在电…

SQL Server查询计划操作符——查询计划相关操作符(4)

7.3. 查询计划相关操作符 28)Declare:该操作符在查询计划中分配一个本地变量。该操作符是一个语言元素。该操作符具体如图7.2-28所示。 图 7.2-28 查询计划操作符Declare示例 29)Delete:该操作符从一个对象中删除满足其参数列中可选谓词的数据行。该操作符具体如图7.2-29…

C++的auto_ptr智能指针:从诞生到被弃用的历程

C作为一种功能强大的编程语言&#xff0c;为开发者提供了众多便捷的特性和工具&#xff0c;其中智能指针是其重要特性之一。智能指针能够自动管理内存&#xff0c;有效避免内存泄漏等常见问题。然而&#xff0c;并非所有智能指针都尽善尽美&#xff0c;auto_ptr便是其中的一个例…

[手机Linux] 七,NextCloud优化设置

安装完成后在个人设置里发现很多警告&#xff0c;一一消除。 只能一条一条解决了。 关于您的设置有一些错误。 1&#xff0c;PHP 内存限制低于建议值 512 MB。 设置php配置文件&#xff1a; /usr/local/php/etc/php.ini 把里面的&#xff1a; memory_limit 128M 根据你自…

微软宣布Win11 24H2进入新阶段!设备将自动下载更新

快科技1月19日消息&#xff0c;微软于1月16日更新了支持文档&#xff0c;宣布Windows 11 24H2进入新阶段。 24H2更新于2024年10月1日发布&#xff0c;此前为可选升级&#xff0c;如今微软开始在兼容的Windows 11设备上自动下载并安装24H2版本。 微软表示&#xff1a;“运行Wi…

ddl-auto: create

package com.test.entity;import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.Comment;import java.time.Instant; import java.util.Objects;Comment("操作日志表") Entity // Entity注解的类将会初始化为一张数据库表 Table(name …

循环队列(C语言)

从今天开始我会开启一个专栏leetcode每日一题&#xff0c;大家互相交流代码经验&#xff0c;也当作我每天练习的自我回顾。第一天的内容是leetcode622.设计循环队列。 一、题目详细 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#…

Golang Gin系列-1:Gin 框架总体概述

本文介绍了Gin框架&#xff0c;探索了它的关键特性&#xff0c;并建立了简单入门的应用程序。在这系列教程里&#xff0c;我们会探索Gin的主要特性&#xff0c;如路由、中间件、数据库集成等&#xff0c;最终能使用Gin框架构建健壮的web应用程序。 总体概述 Gin是Go编程语言的…

在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)

|在线宠物用品交易网站 目录 基于springbootvue的在线宠物用品交易网站 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&am…

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…