在C++中创建一个torch::Tensor来改变形状

Create a torch::Tensor in C++ to change the shape

我有一个张量数组,我想改变张量的形状。我尝试使用 torch.view,但它引发了一个异常 "shape[1] is invalid for input of size 10000"。任何人都可以给我提示错误信息吗?

int shape[] = {1,1,100,100};
torch::Tensor img = torch::zeros((100,100),torch::KF32);
torch::Tensor tmg = img.view(*shape);

C++ 不是 python 所以像 unpacking* 这样的结构显然是行不通的。同样适用于 (, ),你应该使用可以是 "auto-casted" 到 IntArrayRef 的对象。

创建对象基础知识

ArrayRef 是一个 模板 class 这意味着它可以容纳不同的 C++ 类型, IntArrayRef 是 [=20= 的别名].这个 class 有一些构造函数(例如来自标准 C 样式数组,std::vectorstd::arraystd::initializer_list)。

torch::zerosview method of torch::Tensor 都需要这个对象

您可以做的是:

/* auto to feel more "Pythonic" */
auto img = torch::zeros({100, 100}, torch::kF32);
auto tmg = img.view({1, 1, 100, 100});

{1, 1, 100, 100}std::initializer_list<int> 类型所以 ArrayRef<int> (a.k.a. IntArrayRef) 可以从它构造(可能移动因为这个对象是 rvalue).

torch::zeros也是如此。

这种情况下更简单的方法

虽然使用 unsqueeze 可以更轻松地完成这里的内容:

auto img = torch::zeros({100, 100}, torch::kF32);
auto unsqueezed = img.unsqueeze(0).unsqueeze(0);

维度中的 0

关于 libtorch

总而言之,如果您想使用 C++,请至少阅读参考资料并检查类型。我同意文档可以使用一些工作,但是如果您对 C++ 有所了解,那么即使是有时可能需要的源代码也不难理解。