PyTorch C++(LibTorch)如何实现张量多维度切片?
在LibTorch C++中实现Python张量切片操作
两种实现方式
你的Python切片操作是保留第0、3维度的全部元素,对第1、2维度做范围截取,对应LibTorch有两种直观实现方式:
方式1:使用Tensor::slice()方法
slice()的参数为slice(dim, start, end, step),其中step默认是1。对于需要保留全部元素的维度,只需指定start=0、end=tensor.size(dim)即可对应Python的:。实际可以简化为只对需要切片的维度调用slice(),其他维度自动保留:
// 假设h_offset、w_offset、fineSize已定义为整数 auto sliced_tensor = tensor_input .slice(1, h_offset, h_offset + fineSize) // 处理第1维度(高度) .slice(2, w_offset, w_offset + fineSize); // 处理第2维度(宽度)
不需要对第0、3维度调用slice(),因为这两个维度的元素会被完整保留。
方式2:使用索引语法(更贴近Python写法)
通过torch::indexing::Slice可以实现和Python完全一致的索引风格,需要先引入命名空间:
#include <torch/torch.h> using namespace torch::indexing; auto sliced_tensor = tensor_input.index({ Slice(), // 第0维度:对应Python的: Slice(h_offset, h_offset + fineSize), // 第1维度 Slice(w_offset, w_offset + fineSize), // 第2维度 Slice() // 第3维度:对应Python的: });
这种写法可读性更强,和Python代码逻辑完全对齐。
切片的内存机制与效率
LibTorch的切片操作(无论是slice()还是index()的Slice)默认创建的是原张量的视图,不会拷贝内存,所有切片后的张量共享原张量的内存空间,因此几乎没有额外的性能开销,效率极高。
需要注意:你通过torch::from_blob创建的张量本身就共享OpenCV cv::Mat的内存,所以切片后的张量依然和原cv::Mat共享内存,必须保证原cv::Mat在切片张量的生命周期内不被销毁,否则会出现悬空指针问题。如果需要独立的内存,可以调用sliced_tensor.clone()主动拷贝数据。
内容的提问来源于stack exchange,提问作者rbaleksandar
相关产品推荐
相关产品推荐

