libtorch之tensor的使用

news2024/12/24 0:00:30

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.coloradmin.cn/o/1044497.html

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

相关文章

最新AI写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt+MJ以图生图+思维导图生成

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

极光笔记 | 聊一聊推送系统中事件驱动架构的应用

微服务间通信方式主要有2种&#xff1a;RPC和消息传递。 通常来说在请求/响应的场景下使用RPC更加合适&#xff0c;具体实现通常是REST API或者基于长链接的协议&#xff08;例如gRPC/Thrift/Zero ICE等&#xff09;。两个服务有比较强的依赖关系&#xff0c; 调用者依赖被调用…

亚马逊无线鼠标FCC认证办理 FCC ID

无线鼠标是指无线缆直接连接到主机的鼠标&#xff0c;采用无线技术与计算机通信&#xff0c;从而省却电线的束缚。通常采用无线通信方式&#xff0c;包括蓝牙、Wi-Fi (IEEE 802.11)、Infrared (IrDA)、ZigBee (IEEE 802.15.4)等多个无线技术标准。随着人们对办公环境和操作便捷…

OpenAI放出的ChatGPT 4的多模态语音和图像更新

近日OpenAI放出的ChatGPT 4的多模态语音和图像更新的模型其实叫GPT-4V(ision)。OpenAI放出了19页的GPT-4V(ision)报告来解释这个模型&#xff0c;释放了大量信息&#xff1a;GPT-4V(ision)的训练完成于2022年&#xff0c;2023年3月开始提供早期访问。GPT-4V 的训练过程与 GPT-4…

SQLAlchemy关联表一对多关系的详解

目录 ORM关系之一对多 示例1 代码刨析 示例2 代码刨析 ORM关系之一对多 mysql级别的外键&#xff0c;还不够爽&#xff0c;必须拿到一个表的外键&#xff0c;然后通过这个外键再去另外一张表中查找&#xff0c;这样太麻烦了。 SQLAlchemy提供了一个relationship&#xf…

软件工程第三周

可行性研究 续 表达工作量的方式 LOC估算&#xff1a;Line of Code 估算公式S(Sopt4SmSpess)/6 FP&#xff1a;功能点 1. LOC (Line of Code) 估算 定义&#xff1a;LOC是指一个软件项目中的代码行数。 2. FP (Function Points) 估算 定义&#xff1a;FP是基于软件的功能性和…

H5类似易企秀/编辑器/页面制作/开发/生成工具/软件/源码/授权

概述 H5DS (HTML5 Design software) 这是一款基于WEB的 H5制作工具。让不会写代码的人也能轻松快速上手制作H5页面。 详细 项目简介 H5DS (HTML5 Design software) 这是一款基于WEB的 H5制作工具。让不会写代码的人也能轻松快速上手制作H5页面。H5DS 官方 Git (GitHub - h5…

XC3110 高性能、低成本离线式PWM功率开关 可用于小家电电源 辅助电源 最大200MA的电流

XC3110是一款非隔离型、高集成度且低成本的PWM功率开关&#xff0c;适用于降压型和升降压型电路。 XC3110采用高压单晶圆工艺&#xff0c;在同一片晶圆上集成有500V 高压 MOSFET 和采用开关式峰值电流模式控制的控制器。在全电压输入的范围内可以保证高精度的5V 默认输出。在芯…

C#设置自动关机

功能&#xff1a;自动设置电脑关机时间&#xff0c;可取消 创建一个shutdown函数&#xff0c;bool isCancle&#xff0c;传入值为ture就取消关机&#xff0c;interval间隔时间&#xff0c;unit不带符号的整型 private static void ShutdownPC(bool isCancel, uint interval){P…

A*搜索算法

前言 这个我也不知道算不算是A*搜索算法&#xff0c;可能只是A搜索算法。 首先看相关的定义&#xff1a; 启发式搜索在搜索过程中根据启发信息评估各个节点的重要性&#xff0c;优先搜索重要的节点。 估价函数的任务就是估计待搜索节点“有希望”的程度。 估价函数f(n)定义…

vue 实现数字验证码功能

需求&#xff1a;写了一个 手机发送验证码后 输入固定验证码的功能 封装成一个组件,如下: <template><div class"conts"><div class"box"><div class"code_list"><div :class"[ code_item, hideIndex 0 ? co…

Ubuntu Qt 5.15.2 支持 aarch64

概述 AArch64是ARMv8 架构的一种执行状态。 为了更广泛地向企业领域推进&#xff0c;需要引入64 位构架。 同时也需要在ARMv8 架构中引入新的AArch64 执行状态。 AArch64 不是一个单纯的32 位ARM 构架扩展&#xff0c;而是ARMv8 内全新的构架&#xff0c;完全使用全新的A64 指令…

软件设计模式——外观模式

摘要 本文主要分析设计模式 - 结构型 - 外观(Facade)&#xff0c;它提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口&#xff0c;从而让子系统更容易使用。 一、外观模式的意图 提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口&#xff0c;从而让…

2023蓝帽杯半决赛取证复现

1.检材数据开始提取是今年什么时候&#xff1f;&#xff08;答案格式&#xff1a;04-12 13:26&#xff09; 09-11 17:21 这题做错了 其实当时盘古石手机取证里面就有的&#xff0c;想多了去看了日志文件 是真的有点歧义&#xff0c;20分就开始提取任务了 2.嫌疑人手机SD卡存…

TLS/SSL(七) 非对称密码应用 之DH密钥交换协议

一 DH密钥交换协议 DH密钥交换协议用来沟通协商出后面AES算法的密钥,是广泛使用、安全的密钥交换协议 ① RSA密钥交换 备注&#xff1a; RSA算法没有前向保密性&#xff0c;所以TLS1.3及以后的协议禁止RSA作为密钥协商算法 如何理解前向保密性 故事&#xff1a; 斯诺登事…

Spring Cloud Alibaba Seata 搭建以及分布式事务的验证

文章目录 Spring Cloud Alibaba Seata 搭建以及分布式事务的验证1.seata 简介2. seata的三大角色3. Seata的流程4. Seata AT模式5. Seata搭建找到模板案例&#xff0c;照着抄6. Seata Client快速开始6.1 声明式事务实现&#xff08;GlobalTransactional&#xff09;6.2 添加依赖…

【牛客网】倒置字符串

思路 首先将整个字符串逆序,再分别将每个单词逆序 代码 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void reverse(int begin, int end, char[] array){while(begin < end){char temp array[begin…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 A: 子 2023

[蓝桥杯 2023 国 B] 子 2023 试题 A: 子 2023 【问题描述】 小蓝在黑板上连续写下从 1 1 1 到 2023 2023 2023 之间所有的整数&#xff0c;得到了一个数字序列&#xff1a; S 12345678910111213 ⋯ 20222023 S 12345678910111213\cdots 20222023 S12345678910111213⋯2…

USB到UART桥接控制器——GP232RNL

GP232RNL是一款高度集成的USB到UART桥接控制器&#xff0c;提供了一种简单的解决方案&#xff0c;可以使用最少的元器件和PCB空间&#xff0c;将RS232接口转换为USB接口。GP232RNL包括一个USB 2.0全速功能控制器、USB收发器、振荡器、EEPROM和带有完整的调制解调器控制信号的异…

Python完整教程

Python由荷兰国家数学与计算机科学研究中心的吉多范罗苏姆于1990年代初设计&#xff0c;作为一门叫作ABC语言的替代品。 [1] Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语法和动态类型&#xff0c;以及解释型语言的本质&#xff0c;使它成…