libtorch之tensor的使用

1. tensor的创建

    tensor的创建有三种常用的形式,如下所示

    ones创建一个指定维度,数据全为1的tensor. 例子中的维度是2维,5行3列。

               torch::Tensor t = torch::ones({5,3});

    zeros创建一个指定维度,数据全为0的tensor,例子中的维度是三维,分别是4,5,3

               torch::Tensor m = torch::zeros({4,5,3});

   使用tensor函数创建使用指定数据初始化的tensor

               torch::Tensor n = torch::tensor({1,2,3});      创建一维数据是1,2,3的tensor

              torch::Tensor n = torch::tensor({{1,2,3},{4,5,6});      创建二维维的tensor

    但在使用时通常不会使用这种方式创建二维的tensor,而是创建一维的tensor,再通过维度调整函数调整维度,在数据多的时候比较实用。

    除以上三种常用的初始化方式以外,官网还给出了如下几种创建的方式

     创建tensor时,有时需要指定数据类型,可如下操作(其中kFloat指定了浮点数据)

             torch::Tensor a = torch::zeros({1,3,4,4},torch::kFloat);

             torch::Tensor b = torch::ones({1,3,4,4},torch::kFloat);

2.  tensor的维度信息的获取

      获取维度使用Tensor::sizes函数。代码如下:

                torch::Tensor t = torch::ones({5,3});

                torch::IntArrayRef s = t.sizes();    //获取维度,这里时s是一个vector数据,是5和3

               Std::vector<int> s = t.sizes();     //这段代码和上面的代码是等效的,torch::InfArrayRef可以和std::vector<int>互转。更可以说torch::ArrarRef可以和std::vector互转。

3.  tensor的维度调整

     tensor的维度调整使用reshape函数.

                torch::Tensor t = torch::zeros({75});

                torch::Tensor b = t.reshape({3,5,5});

     通过reshape函数将1x75的数据变成3x5x5的数据。这里需要申明的一点,这里只是数据维度的调整,并没有调整数据存储空间,tensor数据的存储是线性存储的。

      与维度相关的另一个函数是permute,它也调整数据空间的维度如

                       torch::Tensor c = b. permute(2,1,0)

       它将b的第3个围堵作为c的第一个维度,b的第二个维度作为c的第二个维度,b的第一个维度作为C的第三个维度,所以c的维度是5x5x3。注意这里只是维度的调整,数据的顺序一点都没变。拿二位数据举个例子

                1,2, 3,  4                        1,2,3,4,5,6

                 5,6, 7,  8                        7,8,9,10,11,12

                 9,10,11,12

              维度发生了变换,数据顺序依旧没有变换

3. tensor元素访问

       tensor元素的访问torch中提供的是select函数和index_select函数(我对这几个函数的理解还不够好,使用老不合自己预期),但我更喜欢下标方式的访问。

               torch::Tensor m = torch::zeros({4,5,3});

              torch::Tensor k = m[2];     //k的shape是5x3

      下标方式可以用来访问元素获取值,也可以设置元素的值,代码如下

              torch::Tensor t = torch::ones({5,3});

              for(int i=0; i<5; i++)

              {

                          t[i] = torch::tensor({1,2,3});      //通过下标设置值

              }

             torch::Tensor m = torch::zeros({4,5,3});

            m[0] = t;                         //通过下标设置值

             m[1] = t;

            m[2] = t;

            m[3] = t;

             torch::Tensor k = m[2];

        通过下标的访问,返回的是一个tensor对象,即使是最后一维元素也是,无法得到像float,int这样的数据类型,需要使用的tensor的item函数获取

         torch::Tensor pms = torch::ones({3,400.300});

         float v = pms[0][5][100].item<float>();

      但需要注意,调用item需要确保它是一个具体的值,不会是一个一维或二位的tensor.

4.  tensor的算数操作

     tensor的算数操作,比较多,但概念和使用上都比较容易,和矩阵的概念一直。(后继在补上这部分内容)

5. tensor的拼接

       tensor的拼接有两种基本形式的拼接,一种是stack式的扩展维度,另一种是cat形式的在某个维度上的连接

        Stack形式的拼接

                  torch::Tensor target = torch::zeros({10},torch::kFloat);

                  target[5] = 1;

                  std::vector<torch::Tensor> tags;

                  for(int i=0;i<5; i++)

                 {

                        tags.push_back(target);

                  }

                 torch::Tensor t = torch::stack(tags);

   Cat形式的拼接

              std::vector<torch::Tensor> ls;

             for(int v : m_rpnCoreSize)

             {

                     std::tuple<torch::Tensor,torch::Tensor> tv = torch::adaptive_max_pool2d(x,{v,v});

                    torch::Tensor tt = std::get<0>(tv);

                    ls.push_back(torch::flatten(tt));

               }

             return torch::cat(ls,0);

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

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

相关文章

Java基于SpringBoot的民宿管理系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 开发环境&#xff1a;后端&#xff1a;前端&#xff1a;数据库&#xff1a; 系统架构&#xff1a…

nginx配置密码访问

安装htpasswd 因为需要使用到htpasswd&#xff0c;htpasswd是Apache服务器中生成用户认证的一个工具&#xff0c;如果未安装&#xff0c;则使用如下命令安装htpasswd。 yum install -y httpd-tools设置用户名和密码 htpasswd 安装成功后&#xff0c;就可以设置用户名和密码&am…

Java项目-Spring Boot的生鲜网上交易系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统功能4 功能设计5系统详细设计5.1系统功能模块5.2后台功能模块5\.2\.1用户功…

vscode左键无法跳转到定义的文件

之前用vscode的时候&#xff0c;明明是可以ctrl键鼠标左键跳转到定义文件的&#xff0c;突然之间就不行了&#xff0c;鼠标移到引入上根本都没有下划线&#xff0c;无法跳转 解决方法&#xff1a; 项目的根目录新建 jsconfig.json 文件&#xff0c;代码如下 {"compiler…

http基础教程(超详细)

HTTP HTTP 一 、基础概念 请求和响应报文URL 二、HTTP 方法 GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE 三、HTTP 状态码 1XX 信息2XX 成功3XX 重定向4XX 客户端错误5XX 服务器错误 四、HTTP 首部 通用首部字段请求首部字段响应首部字段实体首部字段 五、具体应用 连接管理…

敏捷发布列车初探2 ---- Agile Release Train

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 敏捷发布列车二、ART的特性2.敏捷团队为列车提供动力3.与共同节奏保持一致4.关键角色启用 三、ART的责任总结 敏捷发布列车 敏捷发布列车&#xff08;ART&#xff…

CentOS 7.5 centos failed to load selinux policy 错误解决方法

这是个 selinux 使能导致的&#xff0c; 关闭即可 在进入到内核选中界面&#xff0c;选中要启动的内核&#xff0c; 按键盘 e 就会进入启动参数界面 进入启动参数界面如图&#xff0c;按上下键找到 UTF8 UTF8如图&#xff0c; 添加 selinux0 添加完成如图&#xff0c; 按 ctr…

MQTT协议知识梳理,看完你就懂了

目录 一、MQTT简介 二、MQTT框架图 三、MQTT特点 四、MQTT协议原理 1.MQTT协议实现框图 3.网络传输与应用消息 4.MQTT客户端 5.MQTT服务器 6.MQTT协议中的订阅、主题、会话 五、MQTT优缺点 优点 缺点 一、MQTT简介 MQTT是基于TCP/IP协议栈构建的异步通信消息协议&a…

比特币 ZK 赏金系列:第 2 部分——查找哈希冲突

在我们的零知识赏金 (ZKB) 系列的第二部分中&#xff0c;我们将其应用于解决哈希冲突难题。在这样的谜题中&#xff0c;两个不同的输入散列到相同的输出。此类赏金可用于&#xff1a; 充当煤矿中的金丝雀&#xff0c;给我们一个有价值的提醒。存在冲突是散列函数较弱的标志&…

linux内网渗透

一、信息收集 主机发现&#xff1a; nmap -sP 192.168.16.0/24 端口探测 masscan -p 1-65535 192.168.16.168 --rate1000 开放端口如下 nmap端口详细信息获取 nmap -sC -p 8888,3306,888,21,80 -A 192.168.16.168 -oA ddd4-port目录扫描 gobuster dir…

19.组合模式(Composite)

意图&#xff1a;将对象组成树状结构以表示“部分&#xff0d;整体”的层次结构&#xff0c;使得Client对单个对象和组合对象的使用具有一致性。 上下文&#xff1a;在树型结构的问题中&#xff0c;Client必须以不同的方式处理单个对象和组合对象。能否提供一种封装&#xff0c…

如何使用ArcGIS Pro制作标准地图样式国界

相信大家都浏览过标准地图服务提供的标准地图&#xff0c;不知道你有没有想过尝试制作里面的国界&#xff0c;这里为大家介绍一下制作方法&#xff0c;希望能对你有所帮助。 制作已定国界 在地图数据内&#xff0c;国界分为已定国界、未定国界和海岸线&#xff0c;我们先对已定…

B2901A 是德科技keysight精密型电源

181/2461/8938Agilent B2901A精密源/测量单元(SMU)是一款单通道、紧凑且经济高效的台式SMU&#xff0c;能够采集和测量电压和电流。它功能多样&#xff0c;可以轻松、高精度地执行I/V(电流与电压)测量。四象限源和测量功能的集成使I/V测量简单易行&#xff0c;无需配置多种仪器…

如何看待著名游戏引擎 Unity 宣布将更改收费模式,收取「运行时费用」?这将造成哪些影响?

先下结论&#xff1a;Unity 的高管是不是【不友善内容&#xff0c;请于 24 小时内及时更改】&#xff1f; 简单介绍下这个收费模式&#xff1a;年收入大于 20w 美金且安装量大于 20w 的&#xff0c;每一份额外下载需要给 Unity 交 0.2 刀。 首先&#xff1a;听上去好像不会影响…

使用Process Monitor工具探测日志文件是程序哪个模块生成的

目录 1、问题描述 2、使用Process Monitor监测目标文件是哪个模块生成的思路说明 3、操作Process Monitor监测日志文件是哪个模块生成的 4、通过screenctach.dll库的时间戳&#xff0c;找到其pdb文件&#xff0c;然后去查看详细的函数调用堆栈 5、最后 VC常用功能开发汇总…

嵌入式Linux应用开发-文件 IO

嵌入式Linux应用开发-文件 IO 第四章 文件 IO4.1 文件从哪来&#xff1f;4.2 怎么访问文件&#xff1f;4.2.1 通用的 IO 模型&#xff1a;open/read/write/lseek/close4.2.2 不是通用的函数&#xff1a;ioctl/mmap 4.3 怎么知道这些函数的用法&#xff1f;4.4 系统调用函数怎么…

从0开始写中国象棋-创建棋盘与棋子

从控制台版本开始 考虑到象棋程序&#xff0c;其实就是数据结构与算法实现。 所以和界面相关的QT部分我们先放一放。 我们从控制台版本开始。这样大家更容易接受&#xff0c;也不影响开发。 后面我们会把控制台嫁接到QT上完成完整的游戏&#xff0c;那时候自然就水到渠成了…

「大数据-2.0」安装Hadoop和部署HDFS集群

目录 一、下载Hadoop安装包 二、安装Hadoop 0. 安装Hadoop前的必要准备 1. 以root用户登录主节点虚拟机 2. 上传Hadoop安装包到主节点 3. 解压缩安装包到/export/server/目录中 4. 构建软链接 三、部署HDFS集群 0. 集群部署规划 1. 进入hadoop安装包内 2 进入etc目录下的hadoop…

图像几何变换

图像缩放 图像缩放&#xff0c;顾名思义&#xff0c;就是对图像进行整体放大或缩小的操作。图像缩放在数据预处理时经常会用作规范图像的大小&#xff08;宽高&#xff09;&#xff0c;从而便于后面神经网络的处理。OpenCV中是利用cv2.resize(src,dsize,dstNone,fxNone,fyNone…

从零开始之了解电机及其控制(1)磁场与磁力

&#xff08;链接&#xff1a;从零开始之电机FOC控制_foc电机_一只小白啊的博客-CSDN博客&#xff09;之后&#xff0c;总感觉整个流程都知道&#xff0c;但是深入到具体细节时&#xff0c;就不知所措&#xff0c;感觉啥也不懂一样。 那么为什么要用FOC控制无刷电机呢&#xff…