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.rhkb.cn/news/146344.html

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

相关文章

Flutter笔记 - ListTile组件及其应用

Flutter笔记 ListTile组件及其应用 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133411883 目 录 1. …

Ubuntu镜像源cn.arichinve.ubuntu.com不可用原因分析和解决

文章目录 Ubuntu查看系统版本Ubuntu更新系统不能更新Ubuntu查看APT更新源配置cn.archive.ubuntu.com已经自动跳转到清华镜像站Ubuntu变更镜像源地址备份原文件批量在VIM中变更 Ubuntu国内镜像站推荐推荐阅读 今天想要在Ubuntu环境下搭建一个测试环境&#xff0c;进入Ubuntu系统…

UE5 虚幻引擎 详解蓝图通信 必备的知识技能之一!!!

目录 0 引言1 直接蓝图通信1.1 在关卡蓝图中直接拖拽Actor1.2 Get Actor of Class/Get All Actors of Class 2 事件分发器2.1 创建事件分发器2.2 绑定事件分发器2.3 调用事件分发器 3 蓝图接口3.1 使用步骤3.2 为什么要使用蓝图接口 4 蓝图转换 0 引言 问题&#xff1a;为什么需…

加拿大人工智能数据搜索平台【Secoda】完成1400万美元A轮融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于加拿大多伦多的人工智能数据搜索平台【Secoda】今日宣布已完成1400万美元A轮融资。 本轮融资由Craft Ventures领投&#xff0c;参与投资的投资机构有Abstract Ventures、现有投资者YCombi…

std::initializer_list详解

std::initializer_list介绍 initializer_list是C11提供的一种新类型&#xff0c;其定义于头文件<initializer_list>中&#xff0c;此头文件是工具库的一部分&#xff0c; <initializer_list>定义如下&#xff1a; namespace std {template<class E> class…

链表经典面试题(五)

求链表的公共结点 1.题目2.详细的图示3.详细注释和代码实现 1.题目 2.详细的图示 3.详细注释和代码实现 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//定义两个表示长度的指针,让它们指向headA和headB//我们暂时无法知道哪…

Git/GitHub/Idea的搭配使用

目录 1. Git 下载安装1.1. 下载安装1.2. 配置 GitHub 秘钥 2. Idea 配置 Git3. Idea 配置 GitHub3.1. 获取 GitHub Token3.2. Idea 根据 Token 登录 GitHub3.3. Idea 提交代码到远程仓库3.3.1. 配置本地仓库3.3.2. GitHub 创建远程仓库1. 创建单层目录2. 创建多层目录3. 删除目…

Promise击鼓传花

Promise击鼓传花 Promise系列导航前言一、Promise.prototype.then()1.语法2.代码及说明&#xff08;1&#xff09;代码段&#xff1a;&#xff08;2&#xff09;代码段&#xff1a;&#xff08;3&#xff09;代码段&#xff1a;&#xff08;4&#xff09;代码段&#xff1a;&am…

摆脱推荐算法,实现万物皆可『RSS』

前言 相信各位对推荐算法已经很熟悉了&#xff0c;平台基于推荐算法不断推送我们感兴趣的信息&#xff0c;但是身处推荐算法中心&#xff0c;有时我们可能感觉视野越来越闭塞&#xff0c;原来节约我们时间的推荐系统&#xff0c;这时却成了困住我们的信息茧房 那么也许 RSS&a…

错误:F13 is an invalid placement site

在vivado中绑定引脚时提示&#xff1a;F13 is an invalid placement site f13引脚在板子上是接千兆网的rxclk端的。在进一步不排查出现这样的问题提示 Illegal to place instance u_gmii_to_rgmii/u_rgmii_rx/BUFIO_inst on site TIEOFF_X0Y326. The location site type (TIEOF…

java web+Mysql e-life智能生活小区物业管理系统

本项目为本人自己书写&#xff0c;主要服务小区业主和管理人员。 e-life智能生活小区涉及多个方面的智能化和便利化服务&#xff1a; 1. 用户模块&#xff1a;包含基本的登入登出操作&#xff0c;查看个人信息中用户可以查看 自己的个人资料但不可以修改个人信息。 a) 用户…

以太网协议介绍(ARP、UDP、ICMP、IP)

以太网协议介绍 一、ARP协议 请求&#xff1a; 应答&#xff1a; ARP协议&#xff1a; 0x0001 0x0800 6 4硬件类型&#xff1a;2个字节&#xff0c;arp协议不仅能在以太网上运行还能在其他类型的硬件上运行。以太网用1来表示&#xff1b; 协议类型&#xff1a;两字节。指的是a…

雷柏mv20鼠标使用体验

用了1年多&#xff0c;第一次用竖着的鼠标&#xff0c;现在已经很习惯了&#xff0c;感觉还不错。说说使用感受&#xff1a; 1、 仍然是长时间使用鼠标&#xff0c;但是很少出现手腕痛的情况&#xff0c;确实是有一定效果的。 2、使用场景是有限制的&#xff0c;我是配合笔记…

PHP8中final关键字的应用-PHP8知识详解

在PHP8中&#xff0c;final的中文含义是最终的、最后的意思。被final修饰过的类和方法就是“最终的版本”。 如果关键字final放在类的前面&#xff0c;则表示该类不能被继承。 如果关键字final放在方法的前面&#xff0c;则表示该 方法不能被重新定义。 如果有一个类的格式为…

php eayswoole node axios crypto-js 实现大文件分片上传复盘

不啰嗦 直接上步骤 步骤1.开发环境配置 项目需要node.js 做前端支撑 官网下载地址&#xff1a; http://nodejs.cn/download/ 根据自己需要下载对应的版本,我下载的是windows系统64位的版本。 包下载好后 进行安装&#xff0c;安装步骤在此省略... 测试是否安装成功 …

探索ClickHouse——连接Kafka和Clickhouse

安装Kafka 新增用户 sudo adduser kafka sudo adduser kafka sudo su -l kafka安装JDK sudo apt-get install openjdk-8-jre下载解压kafka 可以从https://downloads.apache.org/kafka/下找到希望安装的版本。需要注意的是&#xff0c;不要下载路径包含src的包&#xff0c;否…

1.4.C++项目:仿muduo库实现并发服务器之buffer模块的设计

项目完整版在&#xff1a; 一、buffer模块&#xff1a; 缓冲区模块 Buffer模块是一个缓冲区模块&#xff0c;用于实现通信中用户态的接收缓冲区和发送缓冲区功能。 二、提供的功能 存储数据&#xff0c;取出数据 三、实现思想 1.实现换出去得有一块内存空间&#xff0c;采…

14:00面试测试岗,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

DAMA-DMBOK2重点知识整理CDGA/CDGP——第17章 数据管理和组织变革管理

目录 一、分值分布 二、重点知识梳理 1、引言 2、变革法则 3、并非管理变革&#xff1a;而是管理转型过程 4、科特的变革管理八大误区 5、科特的重大变革八步法 6、变革的秘诀 7、创新扩散和持续变革 8、持续变革 9、数据管理价值的沟通 一、分值分布 CDGA&#xff…

Guava限流器原理浅析

文章目录 基本知识限流器的类图使用示例 原理解析限流整体流程问题驱动1、限流器创建的时候会初始化令牌吗&#xff1f;2、令牌是如何放到桶里的&#xff1f;3、如果要获取的令牌数大于桶里的令牌数会怎么样4、令牌数量的更新会有并发问题吗 总结 实际工作中难免有限流的场景。…