11.21 深度学习-tensor常见操作

import torch

from PIL import Image

from torchvision import transforms

#  获取元素值 tensor.item() 返回一个数值 只能是tensor里面有一个数字的

# 我们可以把单个元素tensor转换为Python数值,这是非常常用的操作

# tensor 里面超过了1个数字就不行

def get_item():

    t1=torch.tensor(1)

    t2=torch.tensor([[[100]]])

    x=t1.item()

    print(x)

    x=t2.item()

    print(x)

    pass

# 元素值四则运算

def compute():

    # 加减乘除

    torch.manual_seed(666)

    t1=torch.rand(3,3)

    # 末尾有下划线的直接是改变原来的数据

    # 对tensor里面的每个元素都 进行 四则运算操作

    # + add

    t1_add=t1.add(1)

    t1.add_(1)

    # - sub

    t1_sub=t1.sub(-1)

    t1.sub_(1)

    # * / 次方同理  mul div  pow

   

    # 也可以通过运算符号来进行 tensor类里面有魔术方法实现了 四则 次方 // % 都可以 这个没有对原来数据进行改变的

    t2=t1+10

    t3=t1**2

    print(t3)

    pass

def hadamard():

    # 两个tensor相同位置的元素相乘 两个tensor形状要一样

    # 阿达玛积指的是矩阵对应位置的元素相乘,可以使用mul函数或者*来实现 其实就是上面的乘法换成了 两个tensor 相乘

    data1 = torch.tensor([[1, 2, 3], [4, 5, 6]])

    data2 = torch.tensor([[2, 3, 4], [2, 2, 3]])

    print(data1 * data2)

    print(data1.mul(data2))

    pass

# 点积

def dotProduct():

    # 就是矩阵乘法的意思 第一个矩阵列数 和第二个矩阵的行数要相同 结果矩阵的形状为(第一个矩阵的行,第二个矩阵的列)

   

    data1 = torch.tensor([

        [1, 2, 3],  

        [4, 5, 6]

    ])

    data2 = torch.tensor([

        [3, 2],

        [2, 3],

        [5, 3]

    ])

    # 使用@或者matmul完成Tensor的乘法。  @ 是点积的符号 a@b  matmul和 mm是tensor的方法 mm只能用于二维的矩阵乘法 就是只有行列的 一般都是二维或者三维 乘法没有交换律注意顺序

    # mm方法也可以用于矩阵相乘 但是只能用于2维矩阵即:$$m*k$$和$$k*n$$ 得到$$m*n$$ 的矩阵

    res1=data1 @ data2

    res2=data1.matmul(data2)

    res3=data1.mm(data2)

    pass

# 索引操作

def index():

    torch.manual_seed(666)

    t1=torch.rand(3,5,5)

    # 跟np数组嵌套的索引差不多 就是嵌套列表的取法 套几个索引

    t1[1]

    t1[1,1]

    t1[1,1,1]

    # 取范围 第一维取 0 和1 取出来的矩阵在取 1

    t1[0:2,1]

    t1[0:2,1:3]

   

    t1[[1,2]] # 取第一维的1和3 在一个维度上取多个的时候传个矩阵进去 这个不会降维的 取出来就相当于重新组了一下 不是切片

    t1[[1,2],[1,1]] # 对应 矩阵取出来 [1,1] [2,1]

    # 也可以进行布尔运算 跟np差不多 返回的是一个布尔矩阵 布尔矩阵可以拿去 返回为ture的元素 返回出来变为1维的了

    x2=t1>0.5

    # print(x2)

    # print(t1[x2])

    # print(t1[t1>0.5])

    # 行级别的条件索引

    t2=torch.rand(5,5)

    x3=t2[:,1]>6 # 所有行的第一列大于6的 前面是行范围 后面是范围  对应一维范围 二维范围 三维范围。。。。 最后一维范围只能是一个数 对最后一维进行判断或者赋值

    t1[0:2,0:2,1]>0.5

    t2[x3]

    # 索引也可以拿来赋值 就是修改数据 取索引然后赋值

    t2[:,:]=6

    print(t2)

    pass

# 张量的拼接 torch的方法 返回一个新的tensor

# 在 PyTorch 中,cat 和 stack 是两个用于拼接张量的常用操作,但它们的使用方式和结果略有不同:

# - **cat**:在现有维度上拼接,不会增加新维度。

# - **stack**:在新维度上堆叠,会增加一个维度。

def splice():

    torch.manual_seed(666)

    t1=torch.rand(3,3)

    t2=torch.rand(3,3)

    # torch.cat(concatenate 的缩写)用于沿现有维度拼接张量。换句话说,它在现有的维度上将多个张量连接在一起。 就是np数组的拼接方式

    # torch.cat() 传参 :第一个 数组 里面是要拼接的tensor 第二个 dim 拼接的轴 注意 拼接的轴 另一个轴的数据量要一样 拼接的轴数据量可以不一样

    # 拼接 一个人完了再下一个人

    t3=torch.cat([t1,t2],dim=0)

    # print(t3)

    # 堆叠 交替添加

    # torch.stack 用于在新维度上拼接张量。换句话说,它会增加一个新的维度,然后沿指定维度堆叠张量 两个矩阵必须size一样

    t4=torch.stack([t1,t2],dim=2)

    print(t4.shape)

    # stack 补充解析

    # 1. 从维度的视角看 会新加一个维度 维度的大小为进行stack矩阵的数量 然后这个位置在新tensor的位置就是dim

    # 2. 从矩阵变换的视角看 比如二维矩阵  dim = 0 就是自己创建一个新的数组然后把 进行stack的两个矩阵放进去

    # dim=1 就是两个矩阵 轮流取第一层的元素组成一个新矩阵的第一层

    # dim=2 就是两个矩阵 轮流取第二层的元素组成新矩阵的第二层 新矩阵的第一层为

    pass

# stack应用 把Image的tensor 转为 cv2的tensor

def demo1():

    transform1=transforms.ToTensor()

    img1=Image.open("assets/image/1.png")

    # img1_t1=transform1(img1)

    img1_t1=torch.rand(4,5,6,7)

    print(img1_t1.shape)

    img1_t2=torch.stack([img1_t1[0],img1_t1[1],img1_t1[2],img1_t1[3]],dim=3)

    print(img1_t2.shape)




 

if __name__=="__main__":

    # get_item()

    # compute()

    # hadamard()

    # dotProduct()

    # index()

    # splice()

    # demo1()

    splice()

    pass

import torch

from PIL import Image

from torchvision import transforms

def sci():

    torch.set_printoptions(sci_mode=False)

    return 0

# 形状操作

# reshape torch 的方法 改玩后的形状 的 元素个数要跟原来的一样 比如原来是10*10 改完后的元素个数必须为100 返回新的tensor

# 可以用于将张量转换为不同的形状,但要确保转换后的形状与原始形状具有相同的元素数量。

def reshape1():

    torch.manual_seed(666)

    t1=torch.rand(20,4)

    # print(t1)

    t2=torch.reshape(t1,(4,20)) # 传入被改的tensor 和形状

    # 可以有一个维度为-1 代表程序自己通过其他维度的元素数量 自己算这个维度的元素数量

    t3=torch.reshape(t1,(40,-1))

    print(t3)

    pass

# 也可以用view变形 tensor的方法

# 这个只能对张量里面的元素是内存连续的 才可以

# 对刚创建出来的tensor进行操作后 就很容易内存不连续 比如转置

# 返回的是原始张量视图,不重新分配内存,效率更高; 比reshape快  这个相当于浅拷贝 不会开新的内存 就是把原来的内存重新排列一下下标

def view1():

    torch.manual_seed(666)

    t1=torch.rand(20,4)

    t2=t1.view(4,20)

    t2[:,-1]=6

    print(t2)

    print(t1)

    pass

# 交换维度 在二维矩阵上像转置一样

# transpose  troch 方法 跟view 一样返回的是原tensor的视图 浅拷贝

# permute tensor 方法 返回一个新的  对维度重新排列 不是浅拷贝

def transpose1():

    torch.manual_seed(666)

    t1=torch.rand(20,4)

    t3=torch.rand(20,4,3)

    t2=torch.transpose(t1,0,1) #  传入tensor和要交换的维度

    t4=torch.transpose(t3,1,2)

    # print(t4.shape)

    t5=t3.permute(1,2,0) # 传入 维度  传入维度的顺序为新的 tensor的维度排序 交换维度

    pass

# tensor展平

# flatten tensor 方法

# flatten 用于将张量展平为一维向量

def flatten1():

    torch.manual_seed(666)

    t1=torch.rand(20,4,3)

    t2=t1.flatten() # 传入开始 展平的层数 和结束展平的层数

    sci()

    print(t2)

    pass

# 升维和降维

# 在后续的网络学习中,升维和降维是常用操作,需要掌握。 tensor 方法 返回新的

# - **unsqueeze**:用于在指定位置插入一个大小为 1 的新维度。 加个[]

# - **squeeze**:用于移除所有大小为 1 的维度,或者移除指定维度的大小为 1 的维度

def squeeze():

    # 降维 一般用于 那些维度的元素数量为1的 直接就删掉了那个维度

    torch.manual_seed(666)

    t1=torch.rand(20,4,3,1,1)

    t2=t1.squeeze() # 传入要删除的维度 默认全部 大小为1 的维度都要删

    print(t2)

    pass

# 升维

def unsqueeze():

    # 升维 在一个维度上 加一个维度 一般都在指定维度的前面

    torch.manual_seed(666)

    t1=torch.rand(20,4,3,1,1)

    t2=t1.unsqueeze(2) # 传入要删除的维度 默认全部 大小为1 的维度都要删

    print(t2.shape)

    pass

# 分割

# 可以按照指定的大小或者块数进行分割。

# chunk  torch方法 按照传入的块数分割 平均 分完后元素的行数个数是平均的 列是最后被分的

# split  按照传入的每一块的元素 的行数分割

# 返回的都是 元组

def split1():

    torch.manual_seed(666)

    t1=torch.rand(20,4)

    t2=torch.chunk(t1,20)

    t3=torch.split(t1,2)

    print(t3[0].shape)

# 广播机制 跟numpy差不多

# 广播机制

# 广播机制允许在对不同形状的张量进行计算,而无需显式地调整它们的形状。广播机制通过自动扩展较小维度的张量,使其与较大维度的张量兼容,从而实现按元素计算。

# 广播机制规则

# 广播机制需要遵循以下规则:

# - 每个张量的维度至少为1

# - 满足右对齐

# 被广播的那个矩阵 的被广播的维度大小为1


 

if __name__=="__main__":

    # reshape1()

    # view1()

    # transpose1()

    # flatten1()

    # squeeze()

    # unsqueeze()

    split1()

    pass

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web3与智能合约:区块链技术下的数字信任体系

随着互联网的不断发展,Web3代表着我们迈入了一个去中心化、更加安全和智能的网络时代。作为Web3的核心组成部分,区块链技术为智能合约的出现和发展提供了强有力的基础。智能合约不仅仅是自动化的代码,它们正逐步成为重塑数字世界信任体系的关…

怎么把湖南平江1000吨黄金开采出来?开采露天金矿的实用公式与方案——露天矿山爆破设计施工方案

在露天矿山爆破设计中,面对多溶洞、多破碎带和多断层的复杂地质条件,需要制定一套科学、合理的爆破方案。以下是一份详细的爆破设计施工方案,包括爆破参数与计算公式: 一、爆破设计原则 1.安全性:确保爆破作业过程中的…

电子应用设计方案-20:智能电冰箱系统方案设计

智能电冰箱系统方案设计 一、系统概述 本智能电冰箱系统旨在提供更便捷、高效、智能化的食品存储和管理解决方案,通过集成多种传感器、智能控制技术和联网功能,实现对冰箱内部环境的精确监测和控制,以及与用户的互动和远程管理。 二、系统组成…

栈的应用,力扣394.字符串解码力扣946.验证栈序列力扣429.N叉树的层序遍历力扣103.二叉树的锯齿形层序遍历

目录 力扣394.字符串解码 力扣946.验证栈序列 力扣429.N叉树的层序遍历 力扣103.二叉树的锯齿形层序遍历 力扣394.字符串解码 看见括号,由内而外,转向用栈解决。使用两个栈处理,一个用String,一个用Integer 遇到数字:提取数字放入到数字栈…

pandas与open读取csv/txt文件速度比较

pandas与open读取csv/txt文件速度比较 由于在工作中经常需要读取txt或csv文件,使用pandas与open均可以读取并操作文件内容,但不知道那个速度更快一些,所以写了一个脚本去比较在文件大小不同的情况下读取数据的速度 测试结果: 大小pandas速度…

039_SettingsGroup_in_Matlab图形界面的设置选项

只要你知道你自己正在做什么,那么你怎么做都行。—— C.J. DateMatlab的界面与设置 Matlab的界面 Matlab的界面是GUI设计中非常值得讨论的一个议题。先来看,默认的Matlab界面。 这里的界面从上到下分为了四个部分,分别是: 工具…

Flink-Source的使用

Data Sources 是什么呢?就字面意思其实就可以知道:数据来源。 Flink 做为一款流式计算框架,它可用来做批处理,也可以用来做流处理,这个 Data Sources 就是数据的来源地。 flink在批/流处理中常见的source主要有两大类…

.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角

窗体透明, 将Form的属性Opacity,由默认的100% 调整到 80%(尽量别低于50%),这个数字越小越透明! 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体,窗体出现在屏幕…

分布式系统稳定性建设-性能优化篇

分布式系统稳定性建设-性能优化篇 系统稳定性建设是系统工程的核心内容之一。以下是一些重要的方面: 架构设计: 采用模块化、松耦合的架构设计,以提高系统的可扩展性和可维护性。合理划分系统功能模块,降低单个模块的复杂度。定义清晰的接口和数据交换标准,确保各模块之间协调…

【bug】使用transformers训练二分类任务时,训练损失异常大

使用transformers训练二分类任务时,训练损失异常大 问题分析 问题 training_loss异常大,在二分类损失中,收敛在1~2附近,而eval_loss却正常(小于0.5) 分析 参考: Bug in gradient accumulation…

电容测试流程

一、外观检测 1. 目的:检验电容样品外观是否与规格书一致,制程工艺是否良好,确保部品的品质。 2. 仪器:放大镜 3. 测试说明: (1)样品上丝印与规格书中相符,丝印信息(…

C++设计模式行为模式———中介者模式

文章目录 一、引言二、中介者模式三、总结 一、引言 中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。 中介者模式可以减少对象之间混乱无序的依赖关系&…

一篇保姆式centos/ubuntu安装docker

前言: 本章节分别演示centos虚拟机,ubuntu虚拟机进行安装docker。 上一篇介绍:docker一键部署springboot项目 一:centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

EasyAnimate:基于Transformer架构的高性能长视频生成方法

这里主要是对EasyAnimate的论文阅读记录,感兴趣的话可以参考一下,如果想要直接阅读原英文论文的话地址在这里,如下所示: 摘要 本文介绍了EasyAnimate,一种利用Transformer架构实现高性能视频生成的高级方法。我们将原…

李宏毅机器学习课程知识点摘要(6-13集)

pytorch简单的语法和结构 dataset就是数据集,dataloader就是分装好一堆一堆的 他们都是torch.utils.data里面常用的函数,已经封装好了 下面的步骤是把数据集读进来 这里是读进来之后,进行处理 声音信号,黑白照片,红…

gpt2的学习

现在学习下gpt2模型做摘要,我们都知道gpt2 是纯decoder,做摘要说话的效果较好。 把数据拆分 按照这个进行tokenizer 用这个tokenizer BertTokenizer.from_pretrained(‘bert-base-chinese’) 2w多词汇表 用交叉熵做lossf, 设好一些简单的…

网络安全设备

防火墙 防火墙是管理和控制网络流量的重要工具,防火墙适用于过滤流量的网络设备。防火墙根据一组定义的规则过滤流量。 静态数据包过滤防火墙 静态数据包过滤防火墙通过检查消息头中的数据来过滤流量。通常,规则涉及源、目标和端口号。静态数据包过滤防…

Python爬虫:深入探索1688关键词接口获取之道

在数字化经济的浪潮中,数据的价值愈发凸显,尤其是在电商领域。对于电商平台而言,关键词不仅是搜索流量的入口,也是洞察市场趋势、优化营销策略的重要工具。1688作为中国领先的B2B电商平台,其关键词接口的获取对于商家来…

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程,提供一些解决思路 需求背景 公司有一个IM项目,对外暴露了两个端口8081和8082,8081是springboot启动使用的端口,对外提供一些http接口…

全面监测Exchange邮件服务器的关键指标

在当今高度信息化的社会,Exchange邮件服务器已成为企业日常通信的重要组成部分。为了确保邮件服务器的稳定运行,及时发现潜在问题并采取相应的解决措施显得尤为重要。监控易作为一款专业的监控工具,为Exchange邮件服务器提供了全方位的监测功…