我有一个张量数组,我想改变张量的形状。我尝试使用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++ 有所了解,那么即使是有时可能需要的源代码也不应该太难理解。