0

我有一个张量数组,我想改变张量的形状。我尝试使用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);
4

1 回答 1

3

C++不是python这样unpacking的结构*显然不会工作。同样适用(, ),您应该使用可以“自动投射”到IntArrayRef.

创建对象基础

ArrayRef是一个模板类,这意味着它可以容纳不同的 C++ 类型,并且IntArrayRefArrayRef<int>. 这个类有一些构造函数(例如,来自标准 C 风格的数组std::vectorstd::arraystd::initializer_list)。

两者torch::zerosview方法都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维度的什么地方。

关于 libtorch

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

于 2020-04-01T11:12:42.443 回答