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

深度学习2

四、tensor常见操作

1、元素值

1.1、获取元素值

        tensor.item() 返回tensor的元素;只能在一个元素值使用,多个报错,当存在多个元素值时需要使用索引进行获取到一个元素值时在使用 item。

1.2、元素值运算

        tensor对元素值的运算:加、减、乘、除、取余、取整、幂

加减乘除:加法(+、add、add_),减法(-、sub、sub_),乘法(*、mul、mul_),除法(/、div、div_)

取整、取余、幂:取整(//)、取余(%):与python 列表操作一致,每个元素都进行单独运算。

# 运算 加减乘除
# 带_的方法基本上都是修改原数据
import torch
torch.manual_seed(666) # 设置随机种子
data1 = torch.randint(1,10,(3,3))
data2 = torch.randint(1,10,(3,3))# 加法
print("+++++++++")
x1 = data1+100
print(x1)
x1 = data1.add(100)
print(x1)
data2.add_(200)
print(data2)# 减法
print("----------")
x1 = data1-100
print(x1)
x1 = data1.sub(100)
print(x1)
data2.sub_(200)
print(data2)# 乘法
print("**********")
x1 = data1*100
print(x1)
x1 = data1.mul(100)
print(x1)
data2.mul_(200)
print(data2)# 除法
print("/")
x1 = data1/100
print(x1)
data2 =data2.type(torch.float16) # 原数据为整数,需要转为浮点数
x1 = data1.div(100) 
print(x1)
data2.div_(200) 
print(data2)

2、阿达玛积

        .dot 点积、* 乘法 、mul 、mm、matmul、@

直接相乘或mul方法都是元素对于位置相乘(形状相同,或者一个为标量)

tensor相乘:data1.dot(data2) 点积用于一阶张量;

                     data1.mm(data2) 用于二阶张量;

                     data1@data2、data1.matmul(data2) 用于一阶及以上张量

import torch# 相乘   * mul()
x = torch.tensor([[1,2],[3,4]])
y = torch.tensor([[11,22],[33,44]])
x1 = x*y
print(x1)
x2 = x.mul(y)
print(x2)# dot matmul
x = torch.tensor([1,2])
y = torch.tensor([11,22])
x3 = x.dot(y)
print(x3)
x3 = x.matmul(y)
print(x3)
x4 = x@y
print(x4)# @ matmul mm
x = torch.tensor([[1,2],[3,4]])
y = torch.tensor([[11,22],[33,44]])
x4 = x@(y)
print(x4)
x5 = x.matmul(y)
print(x5)
x6 = x.mm(y)
print(x6)

3、索引操作

3.1、下标索引

        和列表操作一样,根据元素下标获取对应元素

import torch
torch.manual_seed(666)
x = torch.randint(1,10,(2,3,3))
print(x)
print(x[1])
print(x[1,2])
print(x[1,2,2])
print(x[1,2,2].item())

3.2、切片索引

        与列表操作一致

import torch
torch.manual_seed(666)
x = torch.randint(1,10,(2,3,3))
print(x[:5]) # 下标超出索引界限并不会报错,给出全部数据
print(x[:2,2])
print(x[:2,2:3])
print(x[:2,2:3,1])
print(x[:2,2:3,1:2]) 
print(x[:2,2:3,1:2][1])
print(x[:2,2:3,1:2][1].item())

3.3、布尔索引

        根据得到True返回对应位置的元素,单独索引列时,将该列数据变成一维布尔值结果,根据结果True的下标再去原函数获取对应数据

import torch
torch.manual_seed(666)
x = torch.randint(1,10,(5,5))
print(x)
print(x[x==1])
print(x[x>5])

3.4、组合索引

        将前面三种索引方式组合使用

多个下标索引

下标索引使用列表时,分别取对于数据的多行或多列:

x[[1,2]] 取第二行和第三行的所有列;

 x[,[1,2]] 取所有行的第二列和第三列;

当原数据的行和列都是列表形式时,数据一一对应:也就是从前往后是 1对1,1对n,n对1,n对n,不能n对m:

错误:x[[0,1],[0,1,2]]

正确应该是:x[1,[0,1]] 表示第二行的第一列和第二列;x[[0,1],1] 表示第一行和第二行的第二列;x[[0,1],[0,1]] 表示第一行的第一列和第二行的第二列数据

多个切片索引:维度保持不变,x[:2,:2]表示行取0-1,列取0-1的数据

布尔索引和切片索引:x[x[1]==1, :2]:将x中第二行等于1的数据下标返回作为行下标索引,切0-1列数据

import torch
torch.manual_seed(15)
x = torch.randint(2000,3000,(5,5))
print(x)
x1 = x[(x[:,0]%2==0) & (x[:,1]%2==1) & (x[:,2]%4==0) & (x[:,2]%100!=0),3:5]
print(x1)

4、拼接

        cat stack

        dim 表示维度

        torch.cat([tensor1,tnsor2],dim =0):将tensor1和ensor2拼接;dim=0表示按照行第一维度拼接,添加行,列不变;dim=1表示按照列拼接,行不变;dim=3表示行列格式不变,将元素加维。

import torch
torch.manual_seed(666)
x = torch.randint(1,10,(2,2,2))
y = torch.randint(10,20,(2,2,2))
print(x)
print(y)
z = torch.cat([x,y],dim = 0)
print(z)
z = torch.cat([x,y],dim = 1)
print(z)
z = torch.cat([x,y],dim = 2)
print(z)

         torch.stack([tensor1,tensor2],dim=0):表示将tensor1和tensor2连接;dim=0表示将两个整体放入列表的第一个元素和第二个元素的方式连接;dim=1表示扩展维度后将两个tensor的行下标相同作为同一列的不同行;dim=2表示将原本同一行的数据变成同一列不同行,相当于把第一个列拆分放入下面最接近的行,将第二个同样位置放入第二列,扩展维度后两个tensor的对应位置元素相同作为同一行的不同列

import torch
torch.manual_seed(666)
x = torch.randint(1,10,(2,2))
y = torch.randint(10,20,(2,2))
print(x)
print(y)
z = torch.stack([x,y],dim = 0)
print(z)
z1 = torch.stack([x,y],dim = 1)
print(z1)
z2 = torch.stack([x,y],dim = 2)
print(z2)

5、形状操作

5.1、形状重组

reshape(size)、view(size)

reshape(size):与数组一致,改变tensor形状

import torch
# reshape
data = torch.randint(0, 10, (4, 3))
print(data)
# 1. 使用reshape改变形状
data1 = data.reshape(2, 2, 3)
print(data1)# 2. 使用-1表示自动计算
data2= data.reshape(2, -1)
print(data2)

view(size):将内存连续的tensor形状改变返回新的内存连续tensor,reshape内存不连续

import torchtensor = torch.tensor([[1, 2, 3], [4, 5, 6]])# 使用view进行变形操作
tensor = tensor.view(2, -1)
print(tensor)# 再次使用view操作
try:tensor = tensor.view(3, -1)print("可以使用view")
except:print("不可以使用view")# 进行转置
tensor = tensor.t()
print(tensor)# 转置后使用view操作
try:tensor.view(3, -1)print("可以使用view")
except:print("不可以使用view")

5.2、维度元素个数交换

transpose(下标)、permute(下标)

transpose(维度下标):将两个指定的维度交换

import torch# transpose
x = torch.tensor([[[1, 2, 3], [4, 5, 6]],[[11, 22, 33], [44, 55, 66]]])
print(x,x.shape)
x1 = x.transpose(1,0) # 在不改变其他维度下进行了转置
print(x1,x1.shape)

permute(维度下标):多个下标,根据设置的顺序重新排列维度元素

import torch# permute
torch.manual_seed(666)
x = torch.randint(0,255,(2,3,4))
print(x,x.shape)
x2 = x.permute(2,0,1)
print(x2,x2.shape)
x3 = x.permute(2,1,0)
print(x3,x3.shape)

5.3、维度展开

flatten(start_dim,end_dim)

flatten(start_dim,end_dim):默认从0到-1,所有维度都展开为一维;从start_dim维度开始,到end_dim-1维度结束展开

import torchx = torch.randint(0,255,(2,3,2))
print(x)
x1 = x.flatten()
print(x1)
x2 = x.flatten(start_dim=0,end_dim=1)
print(x2)

 5.4、降维和升维

squeeze()和unsqueeze()

squeeze:无参数默认将自动将所有元素个数为1的维度展开,参数为整数,表示维度下标

import torchimport torch
# 升维和降维
x = torch.randint(0,255,(1,3,4,1))
print(x.shape) #  torch.Size([1, 3, 4, 1])# 元素个数为1的全部降维
x1= x.squeeze() 
print(x1.shape) # torch.Size([3, 4])# 第一个维度释放
x11= x.squeeze(0) #   torch.Size([3, 4, 1])
print(x11.shape)# 释放第二个维度操作失败,因为有多个元素
x11= x.squeeze(1) #  torch.Size([1, 3, 4, 1])
print(x11.shape)# 升维度,必须填写参数
x2 = x.unsqueeze(0) # torch.Size([1, 1, 3, 4, 1])
print(x2.shape)x2 = x.unsqueeze(2) # torch.Size([1, 3, 1, 4, 1])
print(x2.shape)

6、分割

        chunk split;参数都为(tensor,num,dim)

chunk 控制分割结果多少

split 控制分割数量大小

torch.chunk(x, 3,dim=0):参数1为tnsor对象;参数2为分割成多少个结果(不够数量,则值保留原大小,比如5个内容分为3份(2,2,1),2个内容分两份(1,1));参数3为dim,指定维度分隔

torch.split(x, 3,dim=0):参数1为tnsor对象;参数2为分割数量大小(不够数量,则值保留原大小,比如设置值为3,在原说内容切割3个内容分块,不够数量就只有一块);参数3为dim,指定维度分隔

import torchx = torch.tensor([[1, 2], [4, 5], [7, 8], [10, 11], [13, 14]])
# 分割成3块
print(torch.chunk(x, 3,dim=0))
print(torch.chunk(x, 3,dim=1))# 按照每块大小为4进行分割
print(torch.split(x, 4,dim=0))
print(torch.split(x, 4,dim=1))

7、广播

        两个tensor 直接加法或减法运算时,在某个维度的元素个数相等;某个tensor维度元素个数全是1;全部维度元素个数相等

全部相等:直接对应元素计算

某个维度相等,某个tenser其余维度元素个数全是1:将其广播到另一个tensor维度个数大小(复制1那个内容数据)在进行计算

若某个tensoru维度元素个数全为1,则广播值对应tensor维度个数

import torch# 某些维度相等,剩下维度个数为1
data1d = torch.tensor([[[1,1,1,1]],[[1,1,1,1]]])
data2d = torch.tensor([[[11,11,11,11], [22,22,22,22]],[[11,11,11,11], [22,22,22,22]]])
print(data1d.shape, data2d.shape)
# 进行计算:会自动进行广播机制
print(data1d + data2d)# 某些维度相等,剩下维度个数为1
data1d = torch.tensor([[[1,1,1,1]]])
data2d = torch.tensor([[[11,11,11,11], [22,22,22,22]],[[11,11,11,11], [22,22,22,22]]])
print(data1d.shape, data2d.shape)
# 进行计算:会自动进行广播机制
print(data1d + data2d)# 一个rensor维度个数全为1
data1d = torch.tensor([[1]])
data2d = torch.tensor([[[11,11,11,11], [22,22,22,22]],[[11,11,11,11], [22,22,22,22]]])
print(data1d.shape, data2d.shape)
# 进行计算:会自动进行广播机制
print(data1d + data2d)

8、数据的函数运算

floor:向左取值;ceil:向右取值;round:四舍五入;trunc:保留整数;frac:保留小数;fix:向零方向取整数;abs:取绝对值;取余%:-3%2 结果为 1

import torch
data = torch.tensor([[1,2,-3.5],[4,5.1,6.5],[7.3,8,9.5],[10,11.8,-12.5]]
)
print(data)x1 = torch.floor(data) # 向左取值
print(x1)x1 = torch.ceil(data) # 向右取值
print(x1)# 使用python的round()函数
# 四舍六入,五看整数位数的奇偶性,奇进偶不进
x1 = torch.round(data) # 使用python的round()函数    
print(x1)x1 = torch.trunc(data) # 只保留整数部分   
print(x1)x1 = torch.frac(data) # 只保留小数部分  
print(x1)x1 = torch.fix(data) # 向零方向保留整数(整数操作floor,负数操作ceil)
print(x1)x1 = data%2  # 取余  整数减,负数加
print(x1)x1 = torch.abs(data)  # 取绝对值
print(x1)

9、张量保存与加载

save 和  load 

import torch 
x = torch.tensor([1, 2 ,3])# save 保存到本地
torch.save(x, '../../data/tengsor_save.pt')# load 加载本地保存文件
x = torch.load("../../data/tengsor_save.pt",torch.device('cuda') )
print(x.device)

10、并行化

get_num_threads 查看;set_num_threads 设置

        线程数设置过高可能会导致线程竞争,反而降低性能;设置过低可能会导致计算资源未得到充分利用;当使用 GPU 进行计算时,线程数设置对性能影响较小,因为 GPU 计算并不依赖于 CPU 线程数

import torch
print(torch.get_num_threads())torch.set_num_threads(4)
print(torch.get_num_threads())

相关文章:

深度学习2

四、tensor常见操作 1、元素值 1.1、获取元素值 tensor.item() 返回tensor的元素;只能在一个元素值使用,多个报错,当存在多个元素值时需要使用索引进行获取到一个元素值时在使用 item。 1.2、元素值运算 tensor对元素值的运算:…...

第六节-AppScan扫描报告

第六节-AppScan扫描报告 1.加载扫描结果 1.点击【打开】 2.选择之前保存过的扫描结果 3.等待加载完成 2.领导查看的报告 1.点击【报告】 2.模板选择为【缺省值】 3.最低严重性选择为【中】,测试类型选择为【应用程序】 4.点击【布局】 5.选择【其他徽标】&#x…...

【c++丨STL】stack和queue的使用及模拟实现

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C、STL 目录 前言 一、什么是容器适配器 二、stack的使用及模拟实现 1. stack的使用 empty size top push和pop swap 2. stack的模拟实现 三、queue的…...

基于SpringBoot的在线教育系统【附源码】

基于SpringBoot的在线教育系统 效果如下: 系统登录页面 系统管理员主页面 课程管理页面 课程分类管理页面 用户主页面 系统主页面 研究背景 随着互联网技术的飞速发展,线上教育已成为现代教育的重要组成部分。在线教育系统以其灵活的学习时间和地点&a…...

Kafka-副本分配策略

一、上下文 《Kafka-创建topic源码》我们大致分析了topic创建的流程,为了保持它的完整性和清晰度。细节并没有展开分析。下面我们就来分析下副本的分配策略以及副本中的leader角色的确定逻辑。当有了副本分配策略,才会得到分区对应的broker,…...

市场波动不断,如何自我提高交易心理韧性?

交易市场,一个由无数变量交织而成的复杂领域,常常因各方因素的微妙变化而掀起波澜。在这里,机遇与挑战并存,诱人的利润与潜在的风险如影随形,共同考验着每一位交易员的智慧与心理承受能力。在这样的环境下,…...

加速科技精彩亮相中国国际半导体博览会IC China 2024

11月18日—20日,第二十一届中国国际半导体博览会(IC China 2024)在北京国家会议中心顺利举办,加速科技携重磅产品及全系测试解决方案精彩亮相,加速科技创始人兼董事长邬刚受邀在先进封装创新发展论坛与半导体产业前沿与…...

利用c语言详细介绍下选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它是每次选出最小或者最大的元素放在开头或者结尾位置(采用升序的方式),最终完成列表排序的算法。 一、图文介绍 我们还是使用数组【10,5,3…...

华为流程L1-L6业务流程深度细化到可执行

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。具体内容如下: 华为业务流程的深度细化 流程层级:华为业务流程分为 L1 - L6 六个层级,L1 为流程大类,L2 为流程…...

bridge-multicast-igmpsnooping

# 1.topo # 2.创建命名空间 ip netns add ns0 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns0-veth0 type veth peer name hn0-veth0 ip link add ns1-veth0 type veth peer name hn1-veth0 ip link add ns2-veth0 type veth pe…...

git使用(一)

git使用(一) 为什么学习git?两种版本控制系统在github上创建一个仓库(repository)windows上配置git环境在Linux上配置git环境 为什么学习git? 代码写了好久不小心删了,可以使用git防止,每写一部分代码通…...

Linux环境安装MongoDB

文章目录 1. 查看Linux系统的发行版本2. 下载MongoDB3. 安装MongoDB3.1 新建几个目录,分别用来存储 MongoDB 的数据和日志3.2 新建日志文件3.3 新建配置文件 4. 将MongoDB注册为服务4.1 新建服务文件4.2 编写服务文件 5. MongoDB服务相关操作5.1 启动MongoDB服务5.2…...

Cyberchef使用功能之-多种压缩/解压缩操作对比

cyberchef的compression操作大类中有大量的压缩和解压缩操作,每种操作的功能和区别是什么,本章将进行讲解,作为我的专栏《Cyberchef 从入门到精通教程》中的一篇,详见这里。 关于文件格式和压缩算法的理论部分在之前的文章《压缩…...

TypeScript 装饰器都有那些应用场景?如何更快的上手?

TypeScript 装饰器简介 在 TypeScript 中,装饰器(Decorators)是一种特殊的语法,用于在类、类方法、属性、访问器等上动态地添加行为或修改现有行为。装饰器可以用来增强类的功能、修改方法的行为,或者修改类的元数据等…...

堆优化版本的Prim

prim和dijkstra每轮找最小边的松弛操作其实是同源的&#xff0c;因而受dijkstra堆优化的启发&#xff0c;那么prim也可以采用小根堆进行优化。时间复杂度也由 O ( n 2 ) O(n^2) O(n2)降为 O ( n l o g n ) O(nlogn) O(nlogn)。 测试一下吧&#xff1a;原题链接 #include <i…...

Ubuntu上安装MySQL并且实现远程登录

目录 下载网络工具 查看网络连接 更新系统软件包&#xff1b; 安装mysql数据库 查看mysql数据库状态 以数字ip形式显示mysql的监听状态。&#xff08;默认监听端口是3306&#xff09; 查看安装mysql数据库时系统创建的目录信息。 根据查询到的系统用户名以及随机密码&a…...

蓝桥杯每日真题 - 第21天

题目&#xff1a;(空间) 题目描述&#xff08;12届 C&C B组A题&#xff09; 解题思路&#xff1a; 转换单位&#xff1a; 内存总大小为 256MB&#xff0c;换算为字节&#xff1a; 25610241024268,435,456字节 计算每个整数占用空间&#xff1a; 每个 32 位整数占用…...

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验一(下)----空间数据的编辑与处理(超超超详细!!!)

续上篇博客&#xff08;长期更新&#xff09;《零基础入门 ArcGIS(ArcMap) 》实验一&#xff08;上&#xff09;----空间数据的编辑与处理&#xff08;超超超详细&#xff01;&#xff01;&#xff01;&#xff09;-CSDN博客 继续更新 目录 什么是拓扑&#xff1f; 1.3.5道路…...

NLP论文速读(CVPR 2024)|使用DPO进行diffusion模型对齐

论文速读|Diffusion Model Alignment Using Direct Preference Optimization 论文信息&#xff1a; 简介&#xff1a; 本文探讨的背景是大型语言模型&#xff08;LLMs&#xff09;通过人类比较数据和从人类反馈中学习&#xff08;RLHF&#xff09;的方法进行微调&#xff0c;以…...

操作系统——揭开盖子

计算机执行时——取指执行 es:bx等于从0x9000开始&#xff0c;到0x90200结束...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...

6.计算机网络核心知识点精要手册

计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法&#xff1a;数据与控制信息的结构或格式&#xff0c;如同语言中的语法规则语义&#xff1a;控制信息的具体含义和响应方式&#xff0c;规定通信双方"说什么"同步&#xff1a;事件执行的顺序与时序…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...