当前位置: 首页 > article >正文

pytorch 与 张量的处理

系列文章目录


文章目录

  • 系列文章目录
  • 一、Tensor 的裁剪
  • 二、Tensor 的索引与数据筛选
    • torch.where
    • torch.indices
    • torch.gather
    • torch.masked_select
    • torch.take
    • torch.nonzero(省略)
  • 三、Tensor 的组合与拼接
    • torch.cat
    • torch.stack
  • 四、Tensor的切片
    • chunk
    • split
  • 五、Tensor 的变形操作
    • torch.reshape
    • torch.t
    • torch.transpose
    • torch.squeeze 和 torch.unsqueeze
    • torch.unbind
    • torch.flip
    • rot90


一、Tensor 的裁剪

  • 对 tensor 中的元素进行过滤
  • 梯度裁剪,发生在梯度离散或者梯度爆炸时对梯度的处理
  • a.clamp(2,3)

  对数据集进行裁剪有一个好处,可以防止算法过拟合。在损失函数中,我们需要对离散的数据进行处理,梯度的离散化,我们需要解空间变小,更容易收敛。当然在有些数值处理,涉及到指数的增长,爆炸式的增长,我们使用张量裁剪控制数据范围是常用的手段。

import torch
a = torch.rand(2,2)*10
print("a 的数据范围:\n",a)
print("张量裁剪后:\n",a.clamp(1,2))
图 1 张量裁剪
  张量裁剪并不会改变矩阵的大小纬度,是一个数据靠拢的过程。我们随机生成的矩阵数据保留一位小数:0.9,8.4,5.3,2.3.使用 a.clamp(1,2)实际上就是把张量的数据范围控制在1,2之间。具体的做法是:比 1 小的数据取到 1 ,比 2 大的数据取到 2,介于两者之间的数据保持不变。如图 1 张量裁剪所示。

二、Tensor 的索引与数据筛选

  深度学习常用到的函数:

torch.where(condition,x,y) 按照条件从 x 和 y 中筛选出元素组成新的Tensor
torch.gather(input, dim, index, out = None) 在指定的纬度按照索引赋值输出Tensor
torch.index_select(input, dim, index, out = None) 按照指定的索引输出Tensor
torch.masked_select(input, mask, out = None) 按照mask 输出Tensor,输出为向量
torch.take(input,indices) 将输入看成 1D-tensor,按照索引得到输出Tensor
torch.nonzero(input, out = None) 输出非零元素的坐标

  下面进行代码实操

torch.where

import torch
# torch.Where(condition,a,b)
a1 = torch.rand(4,4)*10
b1 = torch.rand(4,4)*10print("a1 的内容:\n",a1)
print("b1 的内容:\n",b1)
print("where 后的内容:\n",torch.where(a1>5,a1,b1))

输出结果:

图 2.1 torch.where 运行结果

  torch.where(a>5,a,b) 意思是:a 的每个元素与 5 进行比较,大于 5 的部分保留,小于 5 的部分使用 b 中对应位置的元素进行填充。

torch.indices

# torch.index_select()
print("a1 的内容:\n",a1)
print("torch.indices:\n",torch.index_select(a1,dim=1,index=torch.tensor([0,3,2])))

输出结果:

图 2.1 torch.index_select 运行结果

  选择输入、维度、索引。特别注意索引的选择 torch.tensor([该维度数组索引]) 。dim = 0,表示从列开始循环,每一列选择对应的元素,我这里从行开始,每一行按照0, 3, 2的索引顺序选择元素,最终组成 4 x 3 的矩阵。选择哪个维度,该维度的长度不变。

torch.gather

# torch.gather(a1,dim = 0,index=)
import torch
a11 = torch.linspace(1,16,16).view(4,4)
print("a11 的内容:\n",a11)
print("torch.gather:\n",torch.gather(a11,dim=1,index=torch.tensor([[3,2,0,1],[3,2,0,1]])))

结果图:

图 2.3 torch.gather 运行结果

  结合代码和运行结果,gatherindex_select构造参数不一样,index_select 可以根据Tensor选择维度索引数组,以此来循环。但是 gather 需要我们明确给出矩阵的形状,而且还要附加索引,感觉更加复杂。而且 gather 无论选择行索引还是列索引,选择好该维度元素,按照行优先构造出新的矩阵 。 代码中出现了 torch.linspace(起始值,末值,个数) ,可以生成一个序列

torch.masked_select

# masked_select
masked = torch.gt(a11,8)
print("masked:\n",masked)
print("torch.masked_select(a11,masked):\n",torch.masked_select(a11,masked))

结果图:

图 2.4 torch.masked_select 运行结果图

  此处的代码接上面的背景。mask 掩码,就是张量类型的 bool 值,通过图 2.4 中的masked就可以看到。采用Tensor的判断语句就可以生成这种掩码,调用torch.masked_select() 传递的参数就只有输入和掩码mask,自动输出一维向量。当然可以通过view来重构张量。

torch.take

print("torch.take:\n",torch.take(a11,index=torch.tensor([3,2,0])))

运行结果:

图 2.5 目录文件

  torch.take 要把整个张量看作是一个一维数组,所以传递的张量数组是一维的,选择对应的元素作为输出,输出结果和 masked_select 一样,是一个向量。

torch.nonzero(省略)

  就传递对应的张量,然后返回给我们零元素的索引数组。

三、Tensor 的组合与拼接

  在做卷积神经网络的时候,我们会在通道使用拼接。

  • torch.cat(sq, dim, out = None) 按照已经存在的纬度进行拼接
  • torch.stack(sq, dim, out = None) 按照新的维度进行拼接
  • torch.gather(input, dim, index, out = None) 在指定维度上按照索引赋值,输出Tensor。(上面已经有案列)

torch.cat

import torch
a = torch.zeros((2,4))
b= torch.ones((2,4))
print("a 的内容:\n",a)
print("b 的内容:\n",b)
print("cat 列拼接\n",torch.cat((a,b),dim=0))
print("cat 行拼接\n",torch.cat((a,b),dim=1))

运行结果:

图 3.1 torch.cat 运行图

  这里生成了一个 2x4 的 0 矩阵和全 1 矩阵,注意写法。cat 拼接 dim = 0,在列的维度上拼接,增加列的长度,列的数目不变。直观来看是在 a 上面加了两行,当然 dim = 0 就是增加行的长度了。

torch.stack

# stack 拼接:
a1 = torch.linspace(1,6,6).view(2,3)
b1 = torch.linspace(7,12,6).view(2,3)
print("a1的内容:\n",a1)
print("b1的内容:\n",b1)
c = torch.stack((a1,b1),dim=0)
c1 = torch.stack((a1,b1),dim=1)
print("stack列:\n",torch.stack((a1,b1),dim=1))
print("stack 行的形状:\n",torch.stack((a1,b1),dim=1).shape)
print("stack列:\n",torch.stack((a1,b1),dim=0))
print("列拼接后的形状:\n",c.shape)

结果图:

图 3.2 torch.stack

  torch.stack 直接把这两个矩阵看做是一个元素,然后形成一个高维度的矩阵。cat 是在原有的基础上进行扩展。我们可以使用这串代码从高维度张量中得到原始分量。

print("按照dim = 0 获取b1:\n",c[1,:,:])
print("按照dim = 1 获取b1;\n",c1[:,1,:])
图 3.3 获取原始成员

四、Tensor的切片

  • torch.chunk(tensor,chunks, dim = ) 按照某个维度平均分块,最后一个块可能小于平均值,chunks 就是块的数目,自己定义。
  • torch.split(tensor, split_size_or_sections, dim = ) 按照某个维度,按照第二个参数给定的 list 或者 int 进行分割。

chunk

import torch
a = torch.randn(2,3)
print("a 的内容:\n",a)
print("chunk 切片:\n",torch.chunk(a, 2, dim=1))
图 4.1 chunk 分片图

  很好理解,类似于用小刀去分一个张量方块,按照一定的步长切割,最后剩下一坨小的。

split

b = torch.randn(10,4)
print("b 的内容:\n",b)
print("split [1,3,6] 内容:\n")
out = torch.split(b,[1,3,6],dim=0)for item in out:print(item,item.shape)

  初始化了一个 10 x 4 的矩阵张量,split 如果第二个参数是整数,那么就和 chunk 一致了。所以我们经常使用 spit ,兼容比较大。当传入一个列表的时候,我们会发现会把矩阵按照这个步长列表分割,就会形成这个容量的分割成员。使用 for 循环打印,如图 4.2 所示:

图 4.2 目录文件

五、Tensor 的变形操作

  • torch.reshape(input,shape)
  • torch.t(input) 2D 矩阵转置
  • torch.transpose(input,dim = 0,dim = 1) 交换两个维度
  • torch.squeeze(input, dim = None, out = None) 去除那些大小为 1 的矩阵
  • torch.unbind(tensor, dim = 0) 去除某个维度
  • torch.unsqueeze(input,dim,out = None) 在指定位置添加维度
  • torch.flip(input, dims) 按照指定的维度反转张量
  • orch.rot(input, k,dims) 按照指定的维度和旋转次数进行张量旋转

torch.reshape

import torch
a = torch.rand(2,3)
print("a 的内容:\n",a)
print("a reshape:\n",a.reshape(3,2))

运行结果:

图 5.1 reshape

   reshape 用于重构任意矩阵,从代码看出,不是转置运算。核心思想是把一个张量看成一个数组(也是存储的底层逻辑),然后按照给定的规模进行重构,顺序选择元素,填入新的张量中。结合运行结果图,更加直观。

torch.t

print("a 的内容:\n",a)
print("a t 转置:\n",a.t())

  转置就是 t,和线性代数的 A T A^T AT 挺像,太简单了,运行结果图就不放了。

torch.transpose

b = torch.rand(1,2,3)
print("b 的内容:\n",b)
print("b transpose:\n",torch.transpose(b,0,1))
print("b shape",torch.transpose(b,0,1).shape)

  随机生成了一个(1,2,3)三维的张量,然后调用torch.transpose 交换前两个维度。
运行结果:

图 5.2 torch.transpose

  这张图注意看,前后的中括号位置,是有变化的,张量交换后变成了(2,1,3)

torch.squeeze 和 torch.unsqueeze

# squeeze 和 unsqueeze
c = torch.squeeze(b,0)
print("b squeeze:\n",c,c.shape)
print("c unsqueeze:\n",c.unsqueeze(0),c.unsqueeze(0).shape)

运行结果:

图 5.3 squeeze 和 unsqueeze

  张量的压缩,只能处理张量是 1 的,比如一个张量(1,2,3),我们使用squeeze 压缩,只能压缩1,也就是 dim = 0,unsqueeze 就是把对应的维度提升到1,加一个中括号。

torch.unbind

# unbind 去除某个维度
d =torch.rand(2,2,3)
print("d 的内容:\n",d)
print("d 去除第一个维度:\n",torch.unbind(d,dim=0))
print("d的成员\n",d[0,:,:])
print("d 去除中间维度:\n",torch.unbind(d,dim=1))
print("d的成员\n",d[:,0,:])
print("d 去除中间维度:\n",torch.unbind(d,dim=2))
print("d的成员\n",d[:,:,0])

结果图:

图 5.4 消去维度

  消去维度,这个理解不难,比如一个张量(2,2,3)去除第三个维度,会形成三个(2,2)的张量,就是成员变量。难点就是你怎么去找准高维度张量的成员。

torch.flip

x = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])result1 = torch.flip(x, dims=[0])
result2 = torch.flip(x, dims=[0, 1])print(result1)
print(result2)

运行结果:

图 5.5 张量反转

  张量反转就是把张量维度进行倒序排列。关键点还是要找准成员,其实不难理解,反而unbind消除维度,找到分解维度的成员难度变得更大。

rot90

这个输入最好就是一张图片,进行旋转,这里就不展示了,用的时候再了解。

相关文章:

pytorch 与 张量的处理

系列文章目录 文章目录 系列文章目录一、Tensor 的裁剪二、Tensor 的索引与数据筛选torch.wheretorch.indicestorch.gathertorch.masked_selecttorch.taketorch.nonzero(省略) 三、Tensor 的组合与拼接torch.cattorch.stack 四、Tensor的切片chunksplit …...

layer norm和 rms norm 对比

Layer norm # Layer Norm 公式 mean x.mean(dim-1, keepdimTrue) var x.var(dim-1, keepdimTrue) output (x - mean) / sqrt(var eps) * gamma beta特点: 减去均值(去中心化)除以标准差(标准化)包含可学习参数 …...

Java高级 | 【实验六】Springboot文件上传和下载

隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...

RKNN开发环境搭建1-基于Ubuntu 18.04系统使用Docker安装rknn-toolkit2

目录 写在最前面Docker 方式安装rknn-toolkit2写在最前面 瑞芯微在RKNN的环境搭建方面的资料很多,但是在搭建过程中发现很多问题教程中并未提及,对初学者不友好。所以博主做了这个系列的文章,从开始搭建环境到对于RKNN Model Zoo的示例进行实践,希望能对初学者有帮助。坚持…...

qt使用笔记二:main.cpp详解

Qt中main.cpp文件详解 main.cpp是Qt应用程序的入口文件&#xff0c;包含程序的启动逻辑。下面我将详细解析其结构和功能。 基本结构 一个典型的Qt main.cpp 文件结构如下&#xff1a; #include <QApplication> // 或者 QGuiApplication/QCoreApplication #include &…...

VBA进度条ProgressForm1

上一章《VBA如何使用ProgressBar进度条控件》介绍了ProgressBar控件的使用方法&#xff0c;今天我给大家介绍ProgressForm1进度条的使用方法&#xff0c;ProgressForm1是集成ProgressBar控件和Label控件的窗体&#xff0c;可以同时显示进度条和百分比&#xff0c;如下图&#x…...

行为型设计模式之Interpreter(解释器)

行为型设计模式之Interpreter&#xff08;解释器&#xff09; 前言&#xff1a; 自己的话理解&#xff1a;自定义一个解释器用来校验参数或数据是否合法。 1&#xff09;意图 给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解…...

深入解析 CAS 操作

一、CAS 的本质&#xff1a;硬件级别的乐观锁 CAS&#xff08;Compare-And-Swap&#xff0c;比较并交换&#xff09; 是一种原子操作指令&#xff0c;用于实现对共享变量的无锁并发修改。它是现代多核处理器支持的底层硬件指令&#xff0c;也是构建高效并发数据结构&#xff0…...

vue3+TS+eslint9配置

记录eslint升级到9.x的版本之后遇到的坑 在 ESLint 9 中&#xff0c;配置方式发生了变化。Flat Config 格式&#xff08;eslint.config.js 或 .ts&#xff09;不再支持 extensions 选项。所以vscode编辑器中的 extensions 需要注释掉&#xff0c;要不然保存的时候不会格式化。…...

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)

在使用ocrmypdf的时候&#xff0c;需要Ghostscript9.55及以上的版本&#xff0c;但是ubuntu自带为9.50 然后使用ocrmypdf报错了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不够安装的版本为9.50不够&#xff0c;因此去官网https://ghostscript.c…...

HarmonyOS5.0——CodeGenie:鸿蒙生态的AI编程革命​

​​CodeGenie&#xff1a;鸿蒙生态的AI编程革命​​ 华为推出的 ​​CodeGenie​​ 是集成于 DevEco Studio 的 AI 辅助编程工具&#xff0c;专为 HarmonyOS 应用开发设计。它通过深度优化 ArkTS 和 C 语言的代码生成能力&#xff0c;显著提升开发效率&#xff0c;降低鸿蒙生…...

【Dv3Admin】系统视图字典管理API文件解析

业务系统中静态数据管理常被忽视&#xff0c;但它直接影响到扩展性与维护效率。字典模块通过集中管理各类基础数据&#xff0c;避免硬编码&#xff0c;使系统具备更高的灵活性和适配能力&#xff0c;成为后台管理平台的重要基础组件。 文章解析 dvadmin/system/views/dictiona…...

免费 SecureCRT8.3下载、安装、注册、使用与设置

参考&#xff1a;SecureCRT 8.3中文 安装教程 - Hope - 博客园...

Redis :String类型

String类型 String是Redis中的字符串&#xff0c;是Redis中最基本的数据类型&#xff0c;直接是按照二进制数据的进行存储 Redis中的所有key都是String类型&#xff0c;但是value是有差别的 常见的命令 set 将String类型的value存储到key中&#xff0c;如果之间有相同的ke…...

两种Https正向代理的实现原理

正向代理 HTTPS 主要有两种方案&#xff0c;分别是基于证书的解密与再加密方案和基于 HTTP CONNECT 隧道的方案&#xff0c;以下是这两种方案的具体信息&#xff1a; 一、基于证书的解密与再加密方案 原理 工作原理&#xff1a;代理服务器拥有自己的证书&#xff0c;客户端需…...

第18节 Node.js Web 模块

什么是 Web 服务器&#xff1f; Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序。 Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL&#xff0c;与客户端的网络浏览器配合。 大多数web服务器都支持服务…...

网络爬虫一课一得

网页爬虫&#xff08;Web Crawler&#xff09;是一种自动化程序&#xff0c;通过模拟人类浏览行为&#xff0c;从互联网上抓取、解析和存储网页数据。其核心作用是高效获取并结构化网络信息&#xff0c;为后续分析和应用提供数据基础。以下是其详细作用和用途方向&#xff1a; …...

LeetCode--24.两两交换链表中的结点

解题思路&#xff1a; 1.获取信息&#xff1a; 给了一个链表&#xff0c;要求两两一组地交换位置 限定条件&#xff1a;只能进行结点交换&#xff0c;不能修改结点内部的值 额外条件&#xff1a;结点数在0-100的范围&#xff0c;闭区间 2.分析题目&#xff1a;…...

嵌入式SDK技术EasyRTC音视频实时通话助力即时通信社交/教育等多场景创新应用

一、引言​ 在数字化时代&#xff0c;即时通信已成为人们生活和工作中不可或缺的部分。音视频功能作为即时通信的核心&#xff0c;能实现更加直观、高效的信息传递。EasyRTC作为一款强大的实时通信框架&#xff0c;具备诸多优势&#xff0c;为即时通信的音视频应用提供了优质解…...

IDEA集成JRebel插件,实现实时热部署

系列文章目录 文章目录 系列文章目录一、JRebel是什么&#xff1f;1.1、对比传统开发流程1.2、JRebel特性以及优势 二、IDEA集成JRebel三、IDEA以JRebel运行报错处理四、IDEA以JRebel运行演示实时热部署 一、JRebel是什么&#xff1f; JRebel 是一款针对 Java 开发的热部署工具…...

1-3 Linux-虚拟机(2025.6.7学习篇- mac版本)

1、VMware Fusion下载 在windows系统中使用的VMwareWorkStation未提供Mac版&#xff0c;Mac系统可以使用VMwareFusionPro FusionPro和WorkstationPro均是VMware公司出品&#xff0c;完全兼容&#xff0c;体验基本是一致的。 下载地址&#xff1a;https://www.vmware.com/cn/pro…...

如何打造一款金融推理工具Financial Reasoning Workflow:WebUI+Ollama+Fin-R1+MCP/RAG

在之前的文章中&#xff0c;我探讨了如何使用具身人工智能&#xff0c;让大语言模型智能体来模仿[当今著名对冲基金经理的投资策略]。 在本文中&#xff0c;我将探讨另一种方法&#xff0c;该方法结合了经过金融推理训练的特定大语言模型&#xff08;LLM&#xff09;&#xff0…...

mybatis的if判断==‘1‘不生效,改成‘1‘.toString()才生效的原因

mybatis的xml文件中的if判断‘1’不生效&#xff0c;改成’1’.toString()才生效 Mapper接口传入的参数 List<Table> queryList(Param("state") String state);xml内容 <where><if test"state ! null and state 1">AND EXISTS(select…...

【试卷篇】Spring面试试卷题

一、选择题 1. 下面关于AOP的说法错误的是&#xff08; C&#xff09;。 A&#xff0e;AOP将散落在系统中的“方面”代码集中实现 B&#xff0e;AOP有助于提高系统的可维护性 C&#xff0e;AOP已经表现出了将要替代面向对象的趋势 D&#xff0e;AOP是一种设计模式&#xff0c…...

通过阿里云 DashScope API 调用通义千问

获取API Key 百炼控制台https://bailian.console.aliyun.com/?tabmodel#/api-key 步骤 1&#xff1a;安装 DashScope SDK pip install dashscope 步骤 2&#xff1a;LangChain 调用 from langchain_community.llms import Tongyi# 设置阿里云 API Key&#xff08;从环境变…...

Go 中 map 的双值检测写法详解

Go 中 map 的双值检测写法详解 在 Go 中&#xff0c;if char, exists : pairs[s[i]]; exists { 是一种利用 Go 语言特性编写的优雅条件语句&#xff0c;用于检测 map 中是否存在某个键。让我们分解解释这种写法&#xff1a; 语法结构解析 if value, ok : mapVariable[key]; …...

大故障:阿里云核心域名爆炸了

大故障&#xff1a;阿里云核心域名被拖走了 今天早上许多群里出现网站故障的讨论&#xff0c;比如 cnblogs 全国访问一片红&#xff0c;一看原来是阿里云又出故障了。 今天早上许多群里出现网站故障的讨论&#xff0c;比如 cnblogs 全国访问一片红&#xff0c;一看原来是阿里云…...

解决Zotero翻译插件Zotero PDF Translate无法正常翻译

试了很多方法了&#xff0c;不管怎么样还是报错&#xff0c;找到最简单的解决办法&#xff0c;把翻译引擎改成CNJI学术翻译就可以了。 不能用的原因是google 翻译API 无法调用。...

【Latex】Windows/Ubuntu 绘制 eps 矢量图通用方法(drawio),支持插入 Latex 数学公式

一直感觉 Visio 或者 PPT 中 Mathtype 对 latex 公式渲染效果不好&#xff0c;且在 Ubuntu 下的支持不好&#xff0c;最近重新调研发现一个好用的工具 drawio。 在线使用 https://app.diagrams.net/?srcabout 也有桌面版的应用&#xff0c;Windows 就下载 exe 安装器&#x…...

Vue---vue使用AOS(滚动动画)库

AOS介绍 aos.js是一个轻量级的动画库插件,可以简单的实现页面滚动触发动画效果,可以让我们网页看起来更加生动(高大上) 官网演示地址:aos.js 安装 YARN, NPM, BOWER安装 yarn add aos npm install aos --save bower install aos --save CDN引入 <link href"https…...