libtorch学习历程(二):张量

news2024/11/15 11:08:51

libtorch(pytorch c++)的大多数api和pytorch保持一致。

使用之前要导入torch

#include <torch/torch.h>
#include <torch/script.h> 

1. 张量初始化

1.1 固定的值与尺寸

在C++中,使用{}来表示尺寸

zeros()

zeros()产生值全为0的张量。

// 得到一个三维的全0
auto x=torch::zeros({2,3,4});
cout<<x;

在这里插入图片描述

ones()

ones()产生值全为1的张量。

auto x = torch::ones({2,3,4});
std::cout<<x;

在这里插入图片描述

eye()

eye()产生单位矩阵张量,传入行数与列数即可

x=torch::eye(4,5);

在这里插入图片描述

full()

full()产生使用指定数值填充的张量。

x=torch::full({2,3,4},10);

在这里插入图片描述

tensor()

tensor()使用指定的值来创建张量,每一位的都要指定。

x = torch::tensor({ {{1,2,3},{4,5,6},{7,8,9} }, {{1,2,3},{4,5,6},{7,8,9} }});

在这里插入图片描述

固定大小,任意值

rand()

rand产生0-1之间的随机值来填充

x=torch::rand({2,3,4});

在这里插入图片描述

randn()

randn取**正态分布N(0,1)**的随机值

x=torch::randn({2,3,4});

在这里插入图片描述

randint()

randint取 [min,max) 的随机整型数值。

// 前两个参数为min与max
x=torch::randint(0,4,{2,3,4})

在这里插入图片描述

从c++的其他数据类型转换而来

libtorch可以接受其他数据指针,通过from_blob函数即可转换。
如果图像是opencv加载的,那么可以通过from_blob将图像指针转成张量。
格式:

from_blob(其他数据,尺寸,元素的数据类型)
int a[6]={1,2,3,4,5,6};
std::vector<float> b={1,2,3,4};
auto x=torch::from_blob(a,{2,3},torch::kFloat);
auto y=torch::from_blob(b,{2,2},torch:kFloat);

使用已有张量

Tensor()

Tensor()需要传入已有张量。
auto d = torch::Tensor(b)等价于auto d = b这种拷贝是浅拷贝,两个张量会互相影响
b中的值发生改变,d也将发生改变;但是b如果只是张量变形,d却不会跟着变形,仍旧保持初始化时的形状

auto x=torch::fully({2,3,4},10);
auto y=torch::Tensor(x);

zeros_like()、ones_like()、rand_like()、full_like()等等 xxx_like()

顾名思义将产生和原张量b相同形状的0张量、1张量与随机张量。注意是形状相同。

x=torch::fully({3,4},10);
y=torch::zeros_like(x);
y=torch::ones_like(x);
y=torch::rand_like(x);
y=torch::full_like(x)

在这里插入图片描述

clone()

完全拷贝成一个新的张量,原张量不是同一个张量,不会互相影响,也就是深拷贝。

y=torch::clone(x);

张量变形

torch改变张量形状,不改变张量存储的data指针指向的内容,只改变张量的取数方式
libtorch的变形方式和pytorch一致,有view,reshape等常用变形。

view

调用view函数得到的张量,虽然形状改变了,但是其与原张量是共用内存的,并没有开辟新的内存,二者会相互影响

 x = torch::full({10},1);
auto a = x.view({2,5});
cout<<a<<endl;

在这里插入图片描述

reshape

调用reshape得到的张量开辟了新的内存,传入一个尺寸。

auto b = x.reshape({5,2});
cout<<b<<endl;

permute

实现多个维度之间的转置,也就是实现数组数据的重新映射,张量有多少个维度就需要传入多少个参数。
参数dims用矩阵的维数代入,一般默认从0开始。即第0维,第1维等等。

permute({dim0,dim1...})

如果是两维,dim分别为0与1。
permute({0,1})这里不做任何变化
permute({1,0})得到的就是矩阵的转置

如果是三维,dim分别为0,1,2
0代表共有几块,1代表每一块中有多少行,2代表每一块中有多少列

例如: x[2][3][4]
permute({0,2,1}):1与2交换
在原数据中,将**x[a][b][c]映射到第三维与第二维的索引交换的x[a][c][b]**中
size变为{2,4,3}

x[0][0][0]=x[0][0][0]
x[0][1][0]=x[0][0][1] #第二维与第三维交换

permute({1,0,2}):0与1交换
在原数据中,将 x[a][b][c] 映射到第三维与第二维的索引交换的 x[b][a][c]
size变为{4,2,3}

permute({1,2,0})
在原数据中,将 x[a][b][c] 映射到第三维与第二维的索引交换的 x[b][c][a]
size变为{3,4,2}

例子:

x = torch::arange(24).view({2,3,4});
auto c=x.permute({0,2,1});
cout<<c<<endl;

在这里插入图片描述

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

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

相关文章

Java数据结构篇

Map体系 1.HashMap 哈希冲突&#xff1a;开放定址法、再哈希法、链地址法插入元素先检查是否到达阈值&#xff0c;是则先数组扩容&#xff0c;然后再插入链表&#xff0c;链表长度超过8则转红黑树1.7之前由于扩容导致的头插法尾插法混合导致指针错误&#xff0c;出现死循环问…

[底层原理] C/C++获取时间(将时间戳转换为年月日)?

前言 大家都知道&#xff0c;计算机中存储的时间是一个整数&#xff0c;在现在的编程语言中&#xff0c;可以很方便地将时间戳&#xff08;整数&#xff09;转换为字符串&#xff0c;但是如果没有这些我们该如何自己计算出呢&#xff1f; 刚好以前研究过Nginx的源代码&#xff…

docker系列12:Dockerfile实战

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx docker系列6&#xff1a;docker安装redis docker系…

红黑树、B+Tree、B—Tree

红黑树 B-Tree 这三个通常都是把内存全部加载到内存里&#xff0c;然后再内存中进行处理的&#xff0c;数据量通常不会很大。 内存一般容量都在GB级别&#xff0c;比如说现在常见的4G、8G或者16G。 如果要处理的数据规模非常大&#xff0c;大到内存根本存不下的时候。这个时候…

基于微信小程序靓丽内蒙古APP(源码+定制+辅导)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

验证码功能的思路和做法

验证码登录的思路和流程 步骤 1.导入依赖 <dependency><groupId>com.github.axet</groupId><artifactId>kaptcha</artifactId><version>0.0.9</version> </dependency> 2.写一个验证码的配置类 package com.lzy.config;im…

IM即时通讯软件,企业即时通讯系统就选WorkPlus

在现代企业中&#xff0c;高效的沟通和协作是推动业务发展的关键。随着科技的不断进步&#xff0c;团队成员和企业之间的沟通已经超越了传统的邮件和电话方式&#xff0c;转向了更实时、更便捷的方式&#xff0c;即即时通讯软件。在众多即时通讯软件中&#xff0c;WorkPlus作为…

滑动窗口解决子串问题

问题解析&#xff1a; 以这道题为例子&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;找长度最小的子数组&#xff0c;子数组和必须大于条件中的target 暴力解法&#xff1a;左右指针列举出每一种子数组的可能&#xff0c;每种可能去求子数组的和&#xff0c;找到最小的…

17 深入理解 C 语言 main 函数:返回值意义、命令行参数接收、跨环境差异及CMD乱码解决

目录 1 main 主函数 2 main 函数的返回值 2.1 返回值的意义 2.2 默认返回值 2.3 返回值类型 3 main 函数的参数 3.1 参数内容 3.2 案例&#xff1a;循环遍历主函数的参数 3.3 不传递参数 3.4 powershell 环境下传参 3.5 cmd 环境下传参 3.6 解决 cmd 输出乱码问题 …

pytorch深度学习基础 7 (简单的线性拟合+检验模型在验证集上的效果)

我们之前做的目的都是评估训练的损失&#xff0c;训练的损失Loss告诉我们&#xff0c;我们的模型是否能够完全拟合训练集&#xff0c;也就是说我们的模型是否有足够的能力处理数据中的相关信息。但是我们之前都是评价训练的好坏&#xff0c;并没有引入验证集。接下来我们就需要…

Java基础——自学习使用(多态)

一、多态的定义 父类的引用指向子类的对象。 B继承A&#xff0c;A abnew B();——父类引用指向子类的对象。 二、创建对象了解多态的内部结构 &#xff08;1&#xff09;父类即A类对象的内存结构图 &#xff08;2&#xff09;子类即B类对象的内存结构图 由于B中重写了父类A中…

EazyDraw for Mac 矢量图绘制设计软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

SSRF和CSRF实战复现

文章目录 SSRFWeb-Hacking-Lab-master1、Centos未授权访问2、Ubuntu未授权访问3、Ubuntu传入公钥访问4、ssrf_redis_lab_pickle_redis_lab CSRF:windphp SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 f…

第三课《排序》

前言 排序是将一组数据&#xff0c;按照指定的顺序或要求来进行排列的过程。是数据结构相关课程和内容较为重要和核心的内容之一&#xff0c;常常作为考试题和面试题目来考察学生和面试者&#xff0c;因此熟练掌握经典的排序算法原理和代码实现是非常重要的 本文介绍了几大较为…

AJAX(5)——Promise

Promise Promise对象用于表示一个异步操作的最终完成或失败及其结果值 语法&#xff1a; //创建Promise对象const p new Promise((resolve, reject) > {//执行异步代码setTimeout(() > {// resolve(成功结果)reject(new Error(失败结果))}, 2000)})//获取结果p.then(r…

坚鹏讲人才第13期:个人数字化转型——个人与时代的共赢之选

坚鹏讲人才第13期&#xff1a;个人数字化转型——个人与时代的共赢之选 在这个日新月异的时代&#xff0c;数字化转型已经成为当今时代的必然趋势&#xff0c;它不仅改变了我们的生活方式&#xff0c;也正在改变着各行各业的运营模式。数字化时代&#xff0c;不仅需要数字化企…

网络udp及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册&#xff1a;•一旦使用 signal 函数注册了信号处理函数&#xff0c;该函数就会一直有效&#xff0c;直到程序结束或者显式地取消注册。2. 注册多次的影响&#xff1a;•如果多次注册同一信号的处理函数&#xff0c;最后一次注册的…

快9月了刚结束基础,武忠祥强化vs张宇18讲应该如何选择?

快9月了&#xff0c;最近有一部分同学刚结束基础&#xff0c;在后台提问&#xff1a;强化到底该学武忠祥还是张宇18讲&#xff1f;其实这个问题&#xff0c;如果你是6月份开始强化&#xff0c;很好回答&#xff0c;但是现在已经快9月份了&#xff0c;很多同学都开始做真题了&am…

代码随想录 刷题记录-16 贪心算法(1)贪心理论基础及习题

一、理论基础 什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心的套路&#xff08;什么时候用贪心&#xff09; 贪心算法并没有固定的套路。 所以唯一的难点就是如何通过局部最优&#xff0c;推出整体最优。 靠自己手动模拟&#xff0c…

深度学习 回归问题

1. 梯度下降算法 深度学习中, 梯度下降算法是是一种很重要的算法. 梯度下降算法与求极值的方法非常类似, 其核心思想是求解 x ′ x x′, 使得 x ′ x x′ 在取 x ⋆ x^{\star} x⋆ 时, 可以使得 l o s s 函数 loss函数 loss函数 的值最小. 其中, 在求解 x ′ x x′ 的过…