在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::vector
、std::array
或 std::initializer_list
)。
torch::zeros
和 view
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++ 有所了解,那么即使是有时可能需要的源代码也不难理解。
我有一个张量数组,我想改变张量的形状。我尝试使用 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::vector
、std::array
或 std::initializer_list
)。
torch::zeros
和 view
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++ 有所了解,那么即使是有时可能需要的源代码也不难理解。