pytorch的操作对象-张量。加强的numpy矩阵,重点了解内存分配机制广播机制

news/2024/4/26 21:53:07/文章来源:https://blog.csdn.net/weixin_43424450/article/details/129235268
  • Numpy是支持大量维度数组与矩阵运算的常用扩展库。但是对于计算图,深度学习或者梯度,Numpy似乎真的有心无力,因为它的计算无法像Tensor一样在GPU上加速。Tensors与Numpy中的 ndarrays类似,但是在PyTorch中 Tensors 可以使用GPU进行计算.

  • 在PyTorch中,torch.Tensor是存储和变换数据的主要工具。如果之前用过NumPy,会发现Tensor和NumPy的多维数组非常类似。然而,Tensor提供GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。

  • "tensor"这个单词一般可译作“张量”,张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是二维张量

  • 创建一个 5x3 矩阵, 但是未初始化,empty方法创建的矩阵不是空矩阵,而是未初始化的矩阵,所以里面的值不一定是0。

    • import torch
      x = torch.empty(5, 3)  
      print(x,type(x))x)
      

tensor([[0.0000e+00, 0.0000e+00, 0.0000e+00],
[0.0000e+00, 0.0000e+00, 7.3008e-43],
[7.0295e+28, 6.1949e-04, 4.5095e+27],
[7.6831e+31, 4.7429e+30, 1.7053e+28],
[1.6020e-19, 4.4721e+21, 4.4330e+27]]) <class ‘torch.Tensor’>

  • 创建一个随机初始化的矩阵:

    • x = torch.rand(5, 3)
      print(x)
      
tensor([[0.6972, 0.0231, 0.3087],[0.2083, 0.6141, 0.6896],[0.7228, 0.9715, 0.5304],[0.7727, 0.1621, 0.9777],[0.6526, 0.6170, 0.2605]])
  • 创建一个0填充的矩阵,数据类型为long:

    • x = torch.zeros(5, 3, dtype=torch.long)
      print(x,type(x),x.dtype))
      

tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]) <class ‘torch.Tensor’> torch.int64

  • 创建tensor并使用现有数据初始化:

    • x = torch.tensor([5.5, 3])
      print(x,type(x),x.dtype))
      

tensor([5.5000, 3.0000]) <class ‘torch.Tensor’> torch.float32

  • 根据现有的张量创建张量。 这些方法将重用输入张量的属性,例如, dtype,除非设置新的值进行覆盖

    • x = x.new_ones(5, 3, dtype=torch.double)      # new_* 方法来创建对象
      print(x,type(x),x.dtype)
      x = torch.randn_like(x, dtype=torch.float)    # 覆盖 dtype!
      print(x,type(x),x.dtype)                      #  对象的size 是相同的,只是值和类型发生了变化)      
      

tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64) <class ‘torch.Tensor’> torch.float64
tensor([[ 0.4735, -1.4062, 0.6846],
[ 2.1270, 1.0104, -0.6296],
[-1.4242, -1.8123, 1.0814],
[-0.8284, -0.2131, 0.8163],
[-0.7036, -0.0401, 0.4185]]) <class ‘torch.Tensor’> torch.float32

  • 加法运算: 【tips:任何 以_ 结尾的操作都会用结果替换原变量. 例如: x.copy_(y), x.t_(), 都会改变 x.】

    • y = torch.rand(5, 3)
      print("随机生成的y",y)
      print("加法结果",x + y)
      res =torch.zeros_like(x)
      torch.add(x, y,out=res)
      print("加法结果",res,res.size())
      y.add_(x)
      print("新y:",y)
      

随机生成的y tensor([[0.0976, 0.0699, 0.3251],
[0.9541, 0.2497, 0.7962],
[0.5003, 0.1983, 0.3777],
[0.4165, 0.2731, 0.6123],
[0.5100, 0.7458, 0.3145]])
加法结果 tensor([[ 0.5710, -1.3363, 1.0097],
[ 3.0812, 1.2601, 0.1666],
[-0.9239, -1.6140, 1.4591],
[-0.4119, 0.0599, 1.4286],
[-0.1937, 0.7057, 0.7329]])
加法结果 tensor([[ 0.5710, -1.3363, 1.0097],
[ 3.0812, 1.2601, 0.1666],
[-0.9239, -1.6140, 1.4591],
[-0.4119, 0.0599, 1.4286],
[-0.1937, 0.7057, 0.7329]]) torch.Size([5, 3])
新y: tensor([[ 0.5710, -1.3363, 1.0097],
[ 3.0812, 1.2601, 0.1666],
[-0.9239, -1.6140, 1.4591],
[-0.4119, 0.0599, 1.4286],
[-0.1937, 0.7057, 0.7329]])

  • 可以使用与NumPy索引方式相同的操作来进行对张量的操作

    • print(x[:, 1])
      print(x[2, :])
      print(x[1:3, 0:2])
      

tensor([-1.4062, 1.0104, -1.8123, -0.2131, -0.0401])
tensor([-1.4242, -1.8123, 1.0814])
tensor([[ 2.1270, 1.0104],
[-1.4242, -1.8123]])

  • torch.view: 可以改变张量的维度和大小,torch.view 与Numpy的reshape类似

    • x = torch.randn(4, 4)
      y = x.view(16)
      z = x.view(-1, 8)  #  size -1 从其他维度推断
      print(x.size(), y.size(), z.size())
      

torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

  • 使用.item()来得到Python数据类型的数值

    • print(x[0][0])
      print(x[0][0].item())
      

tensor(1.6635)
1.6634777784347534

  • 函数功能
    Tensor(*sizes)基础构造函数
    tensor(data,)类似np.array的构造函数
    ones(*sizes)全1Tensor
    zeros(*sizes)全0Tensor
    eye(*sizes)对角线为1,其他为0
    arange(s,e,step)从s到e,步长为step
    linspace(s,e,steps)从s到e,均匀切分成steps份
    rand/randn(*sizes)均匀/标准分布
    normal(mean,std)/uniform(from,to)正态分布/均匀分布
    randperm(m)随机排列
  • 函数功能
    index_select(input, dim, index)在指定维度dim上选取,比如选取某些行、某些列
    masked_select(input, mask)例子如上,a[a>0],使用ByteTensor进行选取
    nonzero(input)非0元素的下标
    gather(input, dim, index)根据index,在dim维度上选取数据,输出的size与index一样
  • 更多关于tensor的操作可查看官方文档:torch — PyTorch 1.13 documentation

  • # 创建相同元素的Tensor
    torch_tensor1  = torch.full([2,3],2)
    # 创建全为1的Tensor
    torch_tensor2 = torch.ones([2,3])
    # 创建全为0的Tensor
    torch_tensor3 = torch.zeors([2,3])
    # 创建对角阵的Tensor
    torch_tensor4  = torch.eye(3)
    # 在区间[1,10]中随机创建Tensor
    torch_tensor5 = torch.randint(1,10,[2,2])
    
  • tensor与NumPy 转换

    • Torch Tensor与NumPy数组共享底层内存地址,修改一个会导致另一个的变化。将一个Torch Tensor转换为NumPy数组:

    • a = torch.ones(5)
      print(a)
      b = a.numpy()
      print(b)
      b[2]=6
      print(a,b)  
      ############
      tensor([1., 1., 1., 1., 1.])
      [1. 1. 1. 1. 1.]
      tensor([1., 1., 6., 1., 1.]) [1. 1. 6. 1. 1.]   
      ###########
      a.add_(1)
      print(a,type(a),b,type(b))  
      ###########  
      tensor([2., 2., 7., 2., 2.]) <class 'torch.Tensor'> [2. 2. 7. 2. 2.] <class 'numpy.ndarray'>
      
  • NumPy Array 转化成 Torch Tensor,使用from_numpy自动转化

    • import numpy as np
      a = np.ones(5)
      b = torch.from_numpy(a)
      np.add(a, 1, out=a)
      print("a:",a,a.dtype,type(a))
      print("b:",b,b.dtype,type(b))
      a: [2. 2. 2. 2. 2.] float64 <class 'numpy.ndarray'>
      b: tensor([2., 2., 2., 2., 2.], dtype=torch.float64) torch.float64 <class 'torch.Tensor'>
      
    • 直接用torch.tensor()将NumPy数组转换成Tensor该方法总是会进行数据拷贝,返回的Tensor和原来的数据不再共享内存

    • # 用torch.tensor()转换时不会共享内存
      import numpy as np
      a = np.ones((3,2))
      c = torch.tensor(a)
      a += 1
      print(a, c)
      
    • [[2. 2.][2. 2.][2. 2.]] tensor([[1., 1.],[1., 1.],[1., 1.]], dtype=torch.float64)
      
  • 所有的 Tensor 类型默认都是基于CPU, CharTensor 类型不支持到 NumPy 的转换. CUDA 张量使用.to 方法 可以将Tensor移动到任何设备中。

  • 如果不想共享内存,推荐先用clone创造一个副本然后再使用view

    • x_cp = x.clone().view(15)
      x -= 1
      print(x)
      print(x_cp)
      
    • tensor([[-1., -1., -1.],[-1., -1., -1.],[-1., -1., -1.],[-1., -1., -1.],[-1., -1., -1.]])
      tensor([8.9082e-39, 1.0194e-38, 9.1837e-39, 8.4490e-39, 1.0102e-38, 1.0653e-38,9.9184e-39, 5.9695e-39, 8.9082e-39, 1.0194e-38, 9.1837e-39, 8.4490e-39,1.0102e-38, 1.0561e-38, 9.0918e-39])
      
  • Tensor的广播机制:当对两个形状不同的Tensor按元素运算时,可能会触发广播机制(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算

    • x = torch.arange(1, 3).view(1, 2)
      print(x)
      y = torch.arange(1, 4).view(3, 1)
      print(y)
      print(x + y)
      

tensor([[1, 2]])
tensor([[1],
[2],
[3]])
tensor([[2, 3],
[3, 4],
[4, 5]])

  • tensor运算的内存开销:索引,view()是不会开辟新的内存的,而像y=x+y这样的运算是会开辟新的内存的,然后y指向新的内存。

    • x = torch.tensor([1, 2])
      y = torch.tensor([3, 4])
      id_before = id(y)
      torch.add(x, y, out=y) 
      print(id(y) == id_before)
      y += x          # 与y=y+x不同
      print(id(y) == id_before)
      y.add_(x)
      print(id(y) == id_before)
      y[:] = y + x       # 索引
      print(id(y) == id_before)
      y = y+ x
      print(id(y) == id_before)
      

True
True
True
True
False

  • 另外,PyTorch还支持一些线性函数,这里提一下,免得用起来的时候自己造轮子,具体用法参考官方文档。如下表所示:

    • 函数功能
      trace对角线元素之和(矩阵的迹)
      diag对角线元素
      triu/tril矩阵的上三角/下三角,可指定偏移量
      mm/bmm矩阵乘法,batch的矩阵乘法
      addmm/addbmm/addmv/addr/baddbmm…矩阵运算
      t转置
      dot/cross内积/外积
      inverse求逆矩阵
      svd奇异值分解

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

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

相关文章

【一】kubernetes集群部署

一、docker环境搭建 1、移除以前docker相关包 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine2、配置yam源 sudo yum install -y yum-utilssudo yum-config-manager --ad…

C++进阶--二叉树编程题

文章目录力扣606. 根据二叉树创建字符串力扣102. 二叉树的层序遍历力扣236. 二叉树的最近公共祖先JZ36 二叉搜索树与双向链表力扣105--通过前序和中序遍历构造二叉树力扣144--二叉树的前序遍历&#xff08;非递归&#xff09;力扣94--二叉树的中序遍历&#xff08;非递归&#…

虹科新闻|虹科与iX systems正式建立合作伙伴关系

近日&#xff0c;虹科与美国iXsystems公司达成战略合作&#xff0c;虹科正式成为iXsystems公司在中国区域的认证授权代理商。未来&#xff0c;虹科将携手iXsystems&#xff0c;共同致力于提供企业级存储解决方案。虹科及iXsystems双方的高层领导人员都对彼此的合作有很大的信心…

操作系统基础教程

目录 第二章&#xff1a;处理器管理 概览 进程调度的层次 进程的调度方式&#xff1a; 调度的评价标准&#xff1a; 典型的调度算法&#xff1a; 第三章&#xff1a;同步、通信和死锁 什么是进程同步&#xff1f; 什么是进程互斥&#xff1f; 进程同步的实现方式 进程…

JVM总结

1. 内存结构 线程私有区 程序计算器 作用&#xff1a;是一块较小的内存空间&#xff0c;存储的是当前线程所执行的字节码文件的序号特点&#xff1a;线程私有&#xff0c;不会出现内存空间溢出 虚拟机栈 虚拟机栈是管理JAVA方法执行的内存模型&#xff0c;每个方法执行时都…

贴吧顶贴软件《今日/更新》

贴吧顶贴软件《今日/更新》百收贴吧工具箱&#xff0c;贴吧顶帖软件&#xff0c;贴吧推广引流神器#贴吧顶帖#贴吧推广 hello&#xff0c;大家好&#xff0c;我是软件的作者百收编辑狂潮老师。本次的视频讲解是作为一个百度顶贴的自动化脚本的视频安装教程和使用教程。你作为新…

SpringCloud(五)MQ消息队列

MQ概念常见消息模型helloworld案例实现实现spring AMQP发送消息实现spring AMQP接收消息工作消息队列实现发布订阅模型Fanout Exchange实现DirectExchange实现TopicExchange实现DirectExchange 和FanoutExchange的差异DirectExchange 和TopicExchange的差异基于RabbitListener注…

钉钉产品体验报告

一、调研的目的了解企业社交软件&#xff0c;借写竞品分析来帮助自己整理思路&#xff0c;看清市场的发展趋势&#xff1b;体验这类企业设计软件&#xff0c;掌握产品核心业务流程和产品结构&#xff0c;把握需求对应的功能点和界面结构&#xff0c;并侧面了解用户习惯&#xf…

用Python做数据分析有哪些优势?

众所周知&#xff0c;可以用作数据分析的语言有很多&#xff0c;包含Python、R语言等&#xff0c;而且Python被誉为数据分析的一大利器&#xff0c;更是该领域的首选语言&#xff0c;那么用Python做数据分析有哪些优势呢?跟着蛋糕往下看。 第一、Python语言自身的优势 Pytho…

ShardingSphere水平、垂直分库、分表和公共表

目录一、ShardingSphere简介二、ShardingSphere-分库分表1、垂直拆分&#xff08;1&#xff09;垂直分库&#xff08;2&#xff09;垂直分表2、水平拆分&#xff08;1&#xff09;水平分库&#xff08;2&#xff09;水平分表三、水平分库操作1、创建数据库和表2、配置分片的规则…

BigGAN

1、BIGGAN 解读1.1、作者 Andrew Brock、Jeff Donahue、Karen Simonyan 1.2、摘要 尽管最近在生成图像建模方面取得了进展&#xff0c;但从 ImageNet 等复杂数据集中 成功生成高分辨率、多样化的样本仍然是一个难以实现的目标。为此&#xff0c;我们以迄 今为止最大的规模训练生…

fastadmin:在新增页面,打开弹窗单选,参数回传

样式&#xff1a;核心代码&#xff1a;一、弹窗的控制器中&#xff1a;// 定义一个公共函数select()&#xff0c;如果这个请求是Ajax&#xff0c;则返回index()函数&#xff0c;否则返回view对象的fetch()函数。 public function select() {if ($this->request->isAjax(…

【软件测试】测试老鸟的迷途,进军高级自动化测试测试......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 很多从业几年的选手…

【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例&#xff0c;欢迎点赞&#xff0c;关注共同学习交流。 电影推荐系统 目录电影推荐系统1. 问题介绍1.1推荐系统矩阵分解方法介绍1.2 数据集&#xff1a;ml-100k2. 推荐系统实现2.1 定义矩阵分解函数2.2 …

消息中间件的概念

中间件(middleware)是基础软件的一大类&#xff0c;属于可复用的软件范畴。中间件在操作系统软件&#xff0c;网络和数据库之上&#xff0c;应用软件之下&#xff0c;总的作用是为处于自己上层的应用软件提供运行于开发的环境&#xff0c;帮助用户灵活、高效的开发和集成复杂的…

ICA简介:独立成分分析

1. 简介 您是否曾经遇到过这样一种情况&#xff1a;您试图分析一个复杂且高度相关的数据集&#xff0c;却对信息量感到不知所措&#xff1f;这就是独立成分分析 (ICA) 的用武之地。ICA 是数据分析领域的一项强大技术&#xff0c;可让您分离和识别多元数据集中的底层独立来源。 …

PPP简介,PPP分层体系架构,PPP链路建立过程及PPP的帧格式

PPP&#xff08;Point-to-Point Protocol&#xff09;是一种用于在两个网络节点之间传输数据的通信协议。它最初是为在拨号网络上进行拨号连接而开发的&#xff0c;现在已经被广泛应用于各种网络环境中&#xff0c;例如在宽带接入、虚拟专用网&#xff08;VPN&#xff09;等场景…

【JAVA】一个项目如何预先加载数据?

这里写目录标题需求实现AutowiredPostConstruct实例CommandLineRunner实例ApplicationListener实例参考需求 一般我们可能会有一些在应用启动时加载资源的需求&#xff0c;局部或者全局使用&#xff0c;让我们来看看都有哪些方式实现。 实现 Autowired 如果是某个类里需求某…

[1]MyBatis+Spring+SpringMVC+SSM整合

一、MyBatis 1、MyBatis简介 1.1、MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c; iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。…

Vue中如何利用websocket实现实时通讯

首先我们可以先做一个简单的例子来学习一下简单的websocket模拟聊天对话的功能 原理很简单&#xff0c;有点像VUE中的EventBus&#xff0c;用emit和on传来传去 首先我们可以先去自己去用node搭建一个本地服务器 步骤如下 1.新建一个app.js&#xff0c;然后创建pagejson.js文…