libtorch入门

libtorch入门
本文仅仅记录自己在最初使用libtorch的一些体会。

torch::index_select

torch::index_select(preds, 1, torch::linspace(0, 1599, 1600).toType(torch::kLong));
如preds的sizes()[1,2100,112]--->索引出来Tensor为[1,1600,112]
第一个参数:preds-->你索引的Tensor
第二个参数:dim--->在哪一个维度
第三个参数:index--->对应的索引,注意这里索引必须为Tensor,且需要int64的数据类型,因此使用toType(torch::kLong)转换为int64类型。
将Tensor的数据类型进行转换时使用Tensor.toType(你需要的类型)即可。

torch::select

index_select可以连续索引,而select只能够取一个。

torch::Tensor bbb = preds.select(1,1);
如preds的sizes()[1,2100,112]--->索引出来Tensor(bbb)[1,112]
第一个参数:dim-->在哪一个维度`
第二个参数:index--->索引,这里索引为int64,跟index_select需要Tensor为索引进行区分`

torch::from_bolb

当使用不同数据时我们都可以将其转为torch::Tensor类型进行处理

torch::Tensor aa = torch::from_blob(preds, {1,255,80,80});
第一个参数:preds-->数组指针,可以是数组指针类型或者是类似于数组指针的首地址
第二个参数:Tensor的大小,如果前面设置的为数组的首地址,则索引数组创建Tensor
第三个参数:可以设置Tensor的数据格式
可以看出,这种方式可以将类似于数组的一段连续的内存创建为Tensor。例如Opencv的mat类型,以及onnxruntime推理出来的tensor可以转换为libtorch对应的tensor,如果不转换两个tensor是有些区别。

访问Tensor

如何访问Tensor,或者说如何取出Tensor中的数据是学习此数据类型的关键,此处一共介绍三种方法。
1.直接访问法
这种访问的方式效率很低,并且速度较慢。

tensor:[1,1600,80]
float a = tensor[0][1][5].item().toFloat();
直接根据各个维度的索引进行直接访问,取其值并转换为你需要的类型即可。

2.accessor访问法
这种方法速度较快。

tensor:[1,1600,80]
auto tensor_1 = tensor.accessor<float, 3>(); float数据类型,之后访问得到的就是这个数据类型,3对于tensor的维度
float a = tensor_1[0][1][5]
这种方式将tensor进行转换,再根据每一维度的索引进行访问,注意这里直接访问得到其值以及对应的类型,
不需要进一步转换。

3.指针访问法
指针访问无疑是最快并且最便捷的操作,推荐大家多多使用。

tensor:[1,1600,80]
float* tensor_ptr = (float*)(tensor.data_ptr());  
float a = tensor_1[1600*1+5];  //访问的跟上面一样的值
tensor_ptr为指向tensor的首个元素的地址,接下来我们就像访问矩阵或者数组一样进行访问tensor啦,
是不是超级方便。

本文为笔者第一篇博客,也算是自己的一个杂乱无章的笔记,读者看的混乱还请见谅,有什么需要讨论的地方希望大家积极留言,大家共同进步!!!
同心、同行、同乐,结伴成长!

你可能感兴趣的:(c++,pytorch)