Pytorch 笔记

执行下面这段代码后,为什么返回的是 2 ?

vector = torch.tensor([7, 7])
vector.shape

为什么返回的是 torch.Size([2])

当你创建一个PyTorch张量时,它会记住张量中元素的数量每个维度的大小。在你的代码中,torch.tensor([7, 7])创建了一个一维张量,其中包含两个元素:7和7。因为这是一个一维张量,所以.shape属性返回一个只有一个元素的元组该元素表示张量的长度。在这种情况下,张量的长度为2,因此返回的形状是torch.Size([2])

tensor 的维度

TENSOR = torch.tensor([[[1, 2, 3],[3, 6, 9],[2, 4, 5]]])
TENSOR.ndim

返回的是 [1,3,3] , 如何判断?有三层 [ ] 括号,将每个 [ ] 括号视为列表,从最里层起,当前列表有几个并列的元素,TENSOR.ndim 返回的列表最右边的元素就是几,然后去掉最外面一层的 [ ] 括号,继续判断当前列表有几个并列的元素,TENSOR.ndim 返回的列表次右边的元素就是几,依次类推。

在这里插入图片描述

Scalar,Vector,Matrix,Tensor

在这里插入图片描述

torch.arange()

torch.arange() 返回的是 PyTorch 中的 tensor,而不是 NumPy 数组。

torch中对tensor的各种切片操作

好的,让我们使用一个三维张量来详细解释各种复杂的切片操作。我们首先创建一个形状为 2 × 3 × 4 2 \times 3 \times 4 2×3×4 的三维张量:

import torch# 创建一个形状为 2x3x4 的三维张量
tensor = torch.arange(24).reshape(2, 3, 4)
print("Original Tensor:")
print(tensor)

假设我们有一个如下所示的三维张量:

tensor([[[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])

1. 选择特定的切片

选择第一个维度的第一个子张量
slice_1 = tensor[0, :, :]
print("Slice along the first dimension (index 0):")
print(slice_1)

输出:

tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
选择第二个维度的第二个子张量
slice_2 = tensor[:, 1, :]
print("Slice along the second dimension (index 1):")
print(slice_2)

输出:

tensor([[ 4,  5,  6,  7],[16, 17, 18, 19]])
选择第三个维度的第三个子张量
slice_3 = tensor[:, :, 2]
print("Slice along the third dimension (index 2):")
print(slice_3)

输出:

tensor([[ 2,  6, 10],[14, 18, 22]])

2. 高级切片操作

选择第一个维度的第一个子张量中的第1到第2行(不包括第2行)
slice_4 = tensor[0, 0:1, :]
print("Slice along the first dimension (index 0) and rows 0 to 1:")
print(slice_4)

输出:

tensor([[0, 1, 2, 3]])
选择第二个维度的第0和第2行,并选择所有列
slice_5 = tensor[:, [0, 2], :]
print("Select rows 0 and 2 from the second dimension:")
print(slice_5)

输出:

tensor([[[ 0,  1,  2,  3],[ 8,  9, 10, 11]],[[12, 13, 14, 15],[20, 21, 22, 23]]])
选择第三个维度的第1和第3列
slice_6 = tensor[:, :, [1, 3]]
print("Select columns 1 and 3 from the third dimension:")
print(slice_6)

输出:

tensor([[[ 1,  3],[ 5,  7],[ 9, 11]],[[13, 15],[17, 19],[21, 23]]])

3. 使用布尔张量进行索引

选择大于10的元素
mask = tensor > 10
slice_7 = tensor[mask]
print("Elements greater than 10:")
print(slice_7)

输出:

tensor([11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])

4. 使用长整型张量进行索引

选择第1和第3列的数据
indices = torch.tensor([1, 3])
slice_8 = tensor[:, :, indices]
print("Select columns indexed by [1, 3]:")
print(slice_8)

输出:

tensor([[[ 1,  3],[ 5,  7],[ 9, 11]],[[13, 15],[17, 19],[21, 23]]])

5. 花式索引

使用多个索引数组
rows = torch.tensor([0, 1])
cols = torch.tensor([2, 3])
slice_9 = tensor[0, rows, cols]
print("Fancy indexing with rows and cols:")
print(slice_9)

输出:

tensor([2, 7])

通过这些示例,希望你对 PyTorch 中的张量索引和切片操作有了更深入的理解。这些操作在数据预处理、特征提取和神经网络模型的实现中非常重要。

torch 中 tensor 的各种乘法

在 PyTorch 中,有多种实现张量相乘的方式,每种方式在实现上有一些差异,有些是就地操作,有些不是。以下是几种主要的实现方式:

1. 元素级相乘 (Element-wise Multiplication)

要求两个 tensor 的 shape 一致

使用 * 操作符
import torcha = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])result = a * b
print(result)
使用 torch.mul()
result = torch.mul(a, b)
print(result)
就地操作

使用 mul_() 方法:

a.mul_(b)
print(a)

2. 矩阵乘法 (Matrix Multiplication)

使用 @ 操作符 (Python 3.5+)
result = a @ b.T  # 转置 b 以使其形状匹配矩阵乘法要求
print(result)
使用 torch.matmul()
result = torch.matmul(a, b.T)
print(result)
使用 torch.mm()(仅适用于二维张量)
result = torch.mm(a, b.T)
print(result)

3. 广义点积 (Dot Product for 1D tensors)

使用 torch.dot()
c = torch.tensor([1, 2, 3])
d = torch.tensor([4, 5, 6])result = torch.dot(c, d)
print(result)

4. 批量矩阵乘法 (Batch Matrix Multiplication)

使用 torch.bmm()
e = torch.randn(10, 3, 4)  # 形状为 (batch_size, m, n)
f = torch.randn(10, 4, 5)  # 形状为 (batch_size, n, p)result = torch.bmm(e, f)
print(result)

5. 广播相乘 (Broadcast Multiplication)

张量会自动广播到兼容的形状。

g = torch.tensor([1, 2, 3])
h = torch.tensor([[1], [2], [3]])result = g * h
print(result)

就地操作总结

就地操作会直接修改原始张量的值,通常以 _ 结尾:

  • a.mul_(b):就地进行元素级相乘

非就地操作会创建新的张量并返回结果,而不改变输入张量的值。

这些不同的乘法操作方式在不同的应用场景中有不同的用途,根据需要选择适合的乘法方式。

广播机制规则

广播机制遵循以下规则:

如果两个 tensor 的维度数不同,那么将维度较少的 tensor 的形状前面补1,直到维度数相同。
接着,对于每个维度,如果两个 tensor 在该维度上的长度相同,或者其中一个 tensor 在该维度上的长度为1,那么这两个 tensor 在该维度上是兼容的,可以进行广播。
广播后,在长度为1的维度上,该 tensor 会被扩展以匹配另一个 tensor 在该维度上的长度。

torch.stack()

torch.stack 是 PyTorch 中用于在新维度上连接一系列张量(tensor)的函数。它可以将一组形状相同的张量沿着指定维度堆叠成一个新的张量。详细解释如下:

函数签名

torch.stack(tensors, dim=0, *, out=None)

参数

  • tensors (sequence of Tensors): 要堆叠的一组张量。所有张量必须具有相同的形状。
  • dim (int): 新维度的索引,定义堆叠的方向。默认值为0。
  • out (Tensor, optional): 可选参数,用于存储输出的张量。

返回值

返回一个新的张量,该张量是在指定维度上堆叠输入张量生成的。

示例

假设有三个形状相同的张量,我们可以使用 torch.stack 将它们堆叠在一起。

import torch# 创建三个形状相同的张量
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
c = torch.tensor([7, 8, 9])# 在维度0上堆叠
stacked_tensor_0 = torch.stack([a, b, c], dim=0)
print(stacked_tensor_0)
# 输出:
# tensor([[1, 2, 3],
#         [4, 5, 6],
#         [7, 8, 9]])# 在维度1上堆叠
stacked_tensor_1 = torch.stack([a, b, c], dim=1)
print(stacked_tensor_1)
# 输出:
# tensor([[1, 4, 7],
#         [2, 5, 8],
#         [3, 6, 9]])

详细说明

  • dim=0 时,新张量的第一个维度是堆叠的张量数量,后面的维度保持不变。在上面的示例中,stacked_tensor_0 的形状为 (3, 3)
  • dim=1 时,新张量的第二个维度是堆叠的张量数量,前面的维度保持不变。在上面的示例中,stacked_tensor_1 的形状为 (3, 3)

注意事项

  1. 张量形状必须相同要堆叠的所有张量必须具有相同的形状,否则会报错。
  2. 新维度的选择:指定的维度 dim 会成为新张量的一个维度,原始张量的维度会相应地向后移动。

使用 torch.stack 可以方便地将多个张量组合成一个新张量,特别是在处理批量数据时非常有用。例如,在图像处理中,可以将多张图片沿着批次维度(通常是第0维)堆叠,形成一个批量张量以便进行批处理操作。

如何理解torch.stack中的dim?

如果进行stack的若干个tensor的维度个数都是n,那么torch.stack中的参数的dim的取值范围是0到n,对吗?
在这里插入图片描述

在这里插入图片描述
上图中 ,

  • dim=0时,shape=(2,3,4) 2个3*4矩阵
  • dim=1时, shape=(3,2,4) 3个2*4矩阵
  • dim=2时,shape=(3,4,2) 3个4*2矩阵

这么理解,dim=0时,将所有要堆叠的tensor视为stack的元素,dim=1时,将所有要堆叠的tensor去掉最外层的一个[ ]括号对之后得到进行stack的元素,依此类推

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

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

相关文章

Redis 线程模型

Redis 线程模型 背景简介Redis 单线程客户端发起 Redis 请求命令的工作原理单线程面临的挑战及问题 Redis 多线程Redis v4.0 多线程命令Redis v6.0 多线程网络模型 总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术…

LangChain学习之 Question And Answer的操作

1. 学习背景 在LangChain for LLM应用程序开发中课程中,学习了LangChain框架扩展应用程序开发中语言模型的用例和功能的基本技能,遂做整理为后面的应用做准备。视频地址:基于LangChain的大语言模型应用开发构建和评估。 2. Q&A的作用 …

了解VS安全编译选项GS

缓冲区溢出攻击的基本原理就是溢出时覆盖了函数返回地址,之后就会去执行攻击者自己的函数; 针对缓冲区溢出时覆盖函数返回地址这一特征,微软在编译程序时使用了安全编译选项-GS; 目前版本的Visual Studio中默认启用了这个编译选项…

Java-----String类

1.String类的重要性 经过了C语言的学习,我们认识了字符串,但在C语言中,我们表示字符串进行操作的话需要通过字符指针或者字符数组,可以使用标准库中提供的一系列方法对字符串的内容进行操作,但这种表达和操作数据的方…

Go语言交叉编译

Golang 支持交叉编译, 在一个平台上生成然后再另外一个平台去执行。 以下面代码为例 build ├── main.go ├── go.mod main.go内容 package mainimport "fmt"func main() {fmt.Println("hello world") }windows系统上操作 1.cmd窗口编译…

【OCPP】ocpp1.6协议第4.2章节BootNotification的介绍及翻译

目录 4.2、BootNotification-概述 Boot Notification 消息 BootNotification 请求消息 BootNotification 响应消息 使用场景 触发 BootNotification 的条件 实现示例 构建请求消息 发送请求并处理响应 小结 4.2、BootNotification-原文译文 4.2.1、被中央系统接受之…

ios v品会 api-sign算法

vip品会 api-sign算法还原 ios入门案例 视频系列 IOS逆向合集-前言哔哩哔哩bilibili 一、ios难度与安卓对比 这里直接复制 杨如画大佬的文章的内容: ios难度与安卓对比 很多人说ios逆向比安卓简单,有以下几个原因 1 首先就是闭源,安卓开源…

无人售货机零售业务成功指南:从市场分析到创新策略

在科技驱动的零售新时代,无人售货机作为一种便捷购物解决方案,正逐步兴起,它不仅优化了消费者体验,还显著降低了人力成本,提升了运营效能。开展这项业务前,深入的市场剖析不可或缺,需聚焦消费者…

ch4网络层---计算机网络期末复习(持续更新中)

网络层概述 将分组从发送方主机传送到接收方主机 发送方将运输层数据段封装成分组 接收方将分组解封装后将数据段递交给运输层网络层协议存在于每台主机和路由器上 路由器检查所有经过它的IP分组的分组头 注意路由器只有3层(网络层、链路层、物理层) 网络层提供的服务 一…

discuz如何添加主导航

大家好,今天教大家怎么样给discuz添加主导航。方法其实很简单,大家跟着我操作既可。一个网站的导航栏是非常重要的,一般用户进入网站的第一印象就是看网站的导航栏。如果大家想看效果的话可以搜索下网创有方,或者直接点击查看效果…

SpringCloud Feign用法

1.在目标应用的启动类上添加开启远程fein调用注解: 2.添加一个feign调用的interface FeignClient("gulimall-coupon") public interface CouponFeignService {PostMapping("/coupon/spubounds/save")R save(RequestBody SpuBondTo spuBounds);…

C++语言学习(七)—— 继承、派生与多态(一)

目录 一、派生类的概念 1.1 定义派生类的语法格式 1.1.1 定义单继承派生类 1.1.2 定义多继承派生类 1.2 继承方式 二、公有继承 三、派生类的构造和析构 四、保护成员的引入 五、改造基类的成员函数 六、派生类与基类同名成员的访问方式 七、私有继承和保护继承 7.…

zdppy_api 中间件请求原理详解

单个中间件的逻辑 整体执行流程: 1、客户端发起请求2、中间件拦截请求,在请求开始之前执行业务逻辑3、API服务接收到中间件处理之后的请求,和数据库交互,请求数据4、数据库返回数据5、API处理数据库的数据,然后给客户…

探索数据结构:快速排序与归并排序的实现与优化

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 快速排序 1.1. 算法思想 **快速排序(Quick Sort)**是Hoare于1962年…

【数据结构】穿梭在二叉树的时间隧道:顺序存储的实现

专栏引入 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累。我想让大家…

AI程序员来了,大批码农要失业

根据GitHub发布的《Octoverse 2021年度报告》,2021年中国有755万程序员,排名全球第二。 ChatGPT的出现,堪比在全球互联网行业点燃了一枚“核弹”,很多人都会担心“自己的工作会不会被AI取代”。 而2024年的AI进展速度如火箭般&am…

getway整合sentinel流控降级

3. 启动sentinel控制台增加流控规则: 根据API分组进行流控: 1.设置API分组: 2.根据API分组进行流控: 自定义统一异常处理: nginx负载配置:

vue-router 源码分析——2. router-link 组件是如何实现导航的

这是对vue-router 3 版本的源码分析。 本次分析会按以下方法进行: 按官网的使用文档顺序,围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码,更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升,甚至面试时…

德人合科技——@天锐绿盾 | -文档透明加密系统

天锐绿盾文档透明加密系统是一种先进的数据安全解决方案,旨在保护企业和组织的敏感信息,防止未经授权的访问和泄漏。 PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是该系统的一些关键特点和功…

【读书笔记】曼陀罗思考法

目录 1 起源2 路径示例——人生规划设计 3 分类3.1 扩展型“扩展型”曼陀罗——使用方法 3.2 围绕型 4 注意事项 1 起源 曼陀罗在梵文中意味着“圣地”,象征着宇宙的秩序和内心的神圣结构。 “曼陀罗思考法”,是由日本学者今泉浩晃发明的方法&#xff…