libtorch学习历程(二):张量

部署运行你感兴趣的模型镜像

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;

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>好的,用户现在想了解libtorch中torch::from_blob函数的详细用法和参数说明。我需要先回忆一下这个函数的作用和常见用法,然后结合用户提供的引用内容来组织回答。 首先,用户之前的问题是关于深度学习中steps_per_epoch的计算,现在转向libtorch的具体函数,这可能是在实际开发中遇到了数据处理或模型转换的问题。用户提供的引用[1]中有一个C++的示例代码,涉及到张量的创建,而引用[2]和[3]则关于TorchScript转换和强化学习的代码结构。这说明用户可能在将PyTorch模型部署到C++环境时遇到了问题,需要处理数据加载或张量创建,因此需要了解from_blob的用法。 torch::from_blob的作用是将现有的内存块转换为libtorch张量,而无需复制数据,这对于性能优化很重要。参数方面,需要明确数据指针、形状、步长、设备等。用户可能关心如何正确传递参数,避免内存问题,以及不同数据类型的处理。 接下来要详细说明函数的参数:data_ptr是内存指针,sizes是形状,strides是步长,options包括数据类型和设备,requires_grad是否需要梯度。需要给出每个参数的类型和示例,比如如何从OpenCV的Mat对象创建张量,这在引用[1]中有涉及,用户可能在做图像处理,所以结合OpenCV的例子会很有帮助。 另外,需要注意内存管理,用户必须确保张量使用期间内存有效。可能用户在使用时遇到悬垂指针的问题,所以需要提醒他们注意生命周期。 然后,提供示例代码,展示如何将不同来源的数据转换为张量,比如数组、OpenCV Mat,并说明不同数据类型的处理。这能帮助用户理解实际应用场景,比如在引用[1]中用户已经使用了libtorch和OpenCV,所以结合这些库的例子更贴切。 最后,生成相关问题,帮助用户深入理解相关主题,如内存管理、与PyTorch的接口差异、数据预处理等。这些扩展问题能引导用户进一步学习,解决可能遇到的后续问题。 总结回答结构:先介绍函数作用,参数详解,使用示例,注意事项,再相关问题。确保内容清晰,符合用户要求的步骤和真实可靠。</think>在LibTorch中,`torch::from_blob` 是一个关键函数,用于将现有的内存数据转换为张量(Tensor),**无需复制底层数据**。这在处理图像、音频等外部数据源时特别有用[^1]。 --- ### 一、函数原型 ```cpp torch::Tensor torch::from_blob( void* data_ptr, // 内存指针 torch::IntArrayRef sizes, // 张量形状 torch::IntArrayRef strides = {}, // 步长(可选) const torch::TensorOptions& options = torch::TensorOptions(), // 数据类型和设备 bool requires_grad = false // 是否需要梯度 ); ``` --- ### 、参数详解 1. **`data_ptr`** - 类型:`void*` - 作用:指向已分配内存的指针,支持`int`、`float`等原生数据类型 - 注意:**必须保证张量生命周期内数据有效**,避免悬垂指针 2. **`sizes`** - 类型:`torch::IntArrayRef`(如`{height, width, channels}`) - 作用:定义输出张量的维度形状 - 示例:`{640, 480, 3}` 表示图像张量的高度、宽度和通道数 3. **`strides`** (可选) - 类型:`torch::IntArrayRef` - 作用:定义内存中数据的步长(每个维度相邻元素的字节偏移量) - 默认值:根据`sizes`自动计算连续内存的步长 4. **`options`** (可选) - 类型:`torch::TensorOptions` - 常用设置: ```cpp torch::TensorOptions().dtype(torch::kFloat32).device(torch::kCPU) ``` - 支持数据类型:`kFloat32`, `kUInt8`, `kInt8`等(参考引用[1]中的张量类型) 5. **`requires_grad`** (可选) - 类型:`bool` - 默认:`false` - 作用:是否启用梯度计算(用于反向传播) --- ### 三、使用示例 #### 1. 从C++数组创建张量 ```cpp float raw_data[] = {1.1, 2.2, 3.3, 4.4}; auto tensor = torch::from_blob( raw_data, {2, 2}, // 形状为2x2 torch::TensorOptions().dtype(torch::kFloat32) ); ``` #### 2. 从OpenCV Mat创建张量(引用[1]结合) ```cpp cv::Mat image = cv::imread("image.jpg"); // 假设为BGR格式的3通道图像 auto tensor = torch::from_blob( image.data, {image.rows, image.cols, 3}, // 形状 HxWxC torch::TensorOptions().dtype(torch::kUInt8) ); ``` #### 3. 指定非连续内存步长 ```cpp int data[6] = {1,2,3,4,5,6}; // 内存布局为每行间隔2个元素(步长=2) auto tensor = torch::from_blob(data, {2,3}, {2,1}, torch::kInt32); ``` --- ### 四、注意事项 1. **内存所有权** - LibTorch不会接管内存管理,需手动确保数据有效性 - 若需自动管理,可结合`torch::Tensor`的`clone()`方法复制数据 2. **数据类型匹配** - 确保`options.dtype()`与实际数据类型一致(如引用[1]中`kI8`对应`int8_t`) 3. **设备一致性** - 默认在CPU上,若需GPU加速需设置`.device(torch::kCUDA)` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值