libtorch学习相关

Libtorch是Pytorch的C++接口,实现了在C++中进行网络训练、网络推理的功能。

除此之外,由于Libtorch中的大部份接口都是与Pytorch一致的,所以Libtorch还是一个很强大的张量库,有着类似Pytorch的清晰接口,这在C++中很难得的。如果你用过C++ Tensor库,就会发现写法比较复杂,学习成本高。因为强类型的限制和通用容器类型的缺失,C++相比Python天然更复杂,库设计者因为语言使用习惯,以及为了性能等因素,设计的接口一般都是高效但难用的。而Libtorch采用了与Pytorch类似的函数接口,如果你使用过Pytorch的话,使用Libtorch学习成本很低,后面会看到具体的例子。

另一个问题是,很多Python库中基础的操作,例如numpy.einsum函数,在C++的Tensor库中没有合适的替代,看看这些搜索你就能了解这个迁移过程有多麻烦。Libtorch解决了这个问题,Pytorch中有的它都有,所以在C++中可以简单地用torch::einsum来使用einsum函数,简直是C++开发者的福音。大部分pytorch中的操作在libtorch中使用torch::都有对应的库函数实现。

使用时只需添加如下头文件即可

#include 
  1. 使用torch::from_blob能够将C++中的数组转换成对应的torch tensor类型。
float arr[] = {1.0, 2.0, 3.0, 4.0};
// 第二个参数表示创建的Tensor shape,会自动对原生数组进行reshape
torch::Tensor bar = torch::from_blob(arr, {1, 4}); // shape是[1, 4]
bar = torch::from_blob(arr, {2, 2}); // shape是[2, 2]

torch::Tensor pose_skeleton = torch::from_blob(pred_xyz_jts_29,{1,87}) * depth_factor;
auto& shapedirs_pre = smpl_neutral_lbs_npz.at("shapedirs");//(6890, 3, 10)
float* shapedirs_data =  shapedirs_pre.data<float>(); 
torch::Tensor shapedirs = torch::from_blob(shapedirs_data, {6890, 3, 10});
  1. 取tensor中一些特定索引的值会有一些大的区别,但是也比较好接受,取索引用Slice()来实现,具体看如下代码:
torch::Tensor transforms = torch::stack(transform_chain, 1);// (1, 24, 4, 4)
//---------------python code------------------
// posed_joints = transforms[:, :, :3, 3]
torch::Tensor posed_joints = transforms.index({Slice(), Slice(), Slice(None, 3), 3});  // 所有关节点在相机坐标系下的位置
// 等效于Python中的foo[:, 0:1, 2:, :-1]
auto bar = foo.index({Slice(), Slice(0, 1), Slice(2, None), Slice(None, -1)});

入门学习libtorch的文档:
https://zhuanlan.zhihu.com/p/609288586
https://zhuanlan.zhihu.com/p/609689737
https://www.cnblogs.com/yanghailin/p/12901586.html

你可能感兴趣的:(学习,python,开发语言)