libtorch / torch 常用语法记录

本文详细介绍了LibTorch的基本操作,包括张量的创建、索引、数据访问及模型加载等核心功能,并提供了丰富的示例代码,帮助读者快速掌握LibTorch的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单整理libtorch的用法
lib torch API
cnpy 读写npy,npz 的库,还算好用

赋值

double array[] = { 1, 2, 3, 4, 5};
auto options = torch::TensorOptions().dtype(torch::kFloat32).device(torch::kCUDA, 1);
torch::Tensor tharray = torch::from_blob(array, {5}, options);

索引

设置 one-hot, by index_put_

feat 最后一维为one-hot

torch::Tensor ids = torch::randint(0, 5, {2, 3} ).to(torch::kLong);
torch::Tensor ids1 = torch::arange(2*3).to(torch::kLong);
torch::Tensor feat = torch::zeros({2, 3, 5});
feat.view({-1, 5}).index_put_( { ids1, ids.view({-1}) }, 1 );

曲折的中间研究

using namespace torch::indexing; // 可以使用None
// feat.index_put_( { Slice(), ids.view({-1}) }, 1 );

accessor

torch::Tensor foo = torch::rand({12, 12}); 
// assert foo is 2-dimensional and holds floats.
auto foo_a = foo.accessor<float,2>();

auto srcdata = score.accessor<float,3>();
// srcdata[i][j][k] 访问 

narrow

ta.index_put_( { Slice(1, 3) }, tb.index( { Slice(1, 3) } ) );
ta.index_put_( { Slice(1, 3) }, tb.narrow(0, 1, 2) );
ta.narrow(0, 1, 2) =  tb.narrow(0, 1, 2) ; // dim, start, len

raw 指针数据

cout<<ids.sizes()<<endl;
int * _a = (int*) ids.data_ptr();
int * _a2 = ids.data_ptr<int>();
cnpy::npy_save("tmp/ck_inp_ids.npy", _a, { ids.size(0), ids.size(1), ids.size(2) },"w");

模型与C++交互

支持可修改变量

  1. 必须 self.register_buffer 这样的变量才能被保存,被修改[内/外]。
  2. 如果没有注册的话,那forward 中不能修改,外部也访问不到。

模型类的方法

主要可以看 这里

torch::jit::script::Module net;
for (const auto& _n : net.named_buffers()) {
    cout<< _n.name <<endl;
    cout<<_n.value.select(0, 1)<<endl;
    auto  a = _n.value.select(0, 1).data_ptr<float>();
    a[0] = 111;
}
void load_(torch::jit::script::Module& net, string fpt){
    net = torch::jit::load(fpt);
}

– torch

插值

希望实现按照 np.interlp 那样的插值,且支持多维

from torch.nn.functional import interpolate

a=torch.zeros( ( 3, 4 ) )
seq=torch.arange(1000)
a[0] = seq[::2][:4]
a[1] = seq[100::2][:4]
a[2] = seq[10::4][:4]

print(a)
a=a.view(1, 3, 4)
print(a.size())
b=interpolate( a, size=(7), mode="linear", align_corners=True )
# 这里size 是看了代码才知道,原来只用管最后一维就行了
print(b)
<think>我们正在解决一个CMake配置错误,涉及在YOLO_ORB_SLAM3项目中使用libtorch、Caffe2和MKL时出现的`target_include_directories`和`target_link_libraries`错误。根据引用资料,我们了解到:-`target_include_directories`用于向特定目标(target)添加包含目录(引用[1]和引用[3])。-`target_link_libraries`用于指定目标链接的库(引用[4]中提到`link_libraries`和`target_link_libraries`的区别,但这里我们关注`target_link_libraries`)。错误可能包括:1.未正确设置libtorch、Caffe2和MKL的头文件路径(导致找不到头文件)。2.未正确链接MKL等库(导致链接错误)。解决方案步骤:1.确保已正确安装libtorch(PyTorchC++版本)和MKL,并知道它们的安装路径。2.在CMakeLists.txt中,使用`find_package`查找依赖项(如MKL),但注意libtorch通常通过设置`Torch_DIR`来配置。3.使用`target_include_directories`为每个目标添加必要的头文件目录。4.使用`target_link_libraries`为每个目标链接所需的库。具体操作:步骤1:设置libtorch路径假设已经下载了libtorch,并将其路径设置为环境变量,或者在CMake中直接设置路径。例如:```cmakeset(Torch_DIR/path/to/libtorch/share/cmake/Torch)find_package(TorchREQUIRED)```步骤2:查找MKL如果项目需要MKL,可以使用:```cmakefind_package(MKLREQUIRED)```或者,如果libtorch已经包含了MKL,则可能不需要单独查找,但需要确保链接到libtorch时包含了MKL。步骤3:为每个目标添加头文件和链接库例如,如果有一个可执行文件目标`MyApp`:```cmakeadd_executable(MyApp...)target_include_directories(MyAppPRIVATE${TORCH_INCLUDE_DIRS}#其他私有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值