我有一个张量数组,我想改变张量的形状。我尝试使用torch.view,但它引发了一个异常,即“shape[1] 对于大小为 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的结构*显然不会工作。同样适用(, ),您应该使用可以“自动投射”到IntArrayRef.
ArrayRef是一个模板类,这意味着它可以容纳不同的 C++ 类型,并且IntArrayRef是ArrayRef<int>. 这个类有一些构造函数(例如,来自标准 C 风格的数组std::vector、std::array或std::initializer_list)。
两者torch::zeros和view方法都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>(又名IntArrayRef)可以从它构造(可能移动,因为这个对象是一个rvalue)。
同样的事情发生在torch::zeros.
你在这里所拥有的东西可以通过这样的方式更容易地完成unsqueeze:
auto img = torch::zeros({100, 100}, torch::kF32);
auto unsqueezed = img.unsqueeze(0).unsqueeze(0);
在0维度的什么地方。
总而言之,如果您想使用 C++ ,请至少阅读参考并检查类型。我同意文档可以使用一些工作,但是如果您对 C++ 有所了解,那么即使是有时可能需要的源代码也不应该太难理解。