【问题标题】:Create a torch::Tensor in C++ to change the shape在 C++ 中创建一个 torch::Tensor 来改变形状
【发布时间】:2020-04-01 19:13:05
【问题描述】:

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


    【解决方案1】:

    C++ 不是python,所以像unpacking* 这样的结构显然不起作用。 (, ) 也是如此,您应该使用可以“自动投射”到 IntArrayRef 的对象。

    创建对象基础知识

    ArrayRef 是一个模板类,这意味着它可以容纳不同的 C++ 类型,而IntArrayRefArrayRef<int> 的别名。这个类有一些构造函数(例如,来自标准 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>(又名IntArrayRef)(可能会移动,因为该对象是rvalue)。

    torch::zeros 也会发生同样的情况。

    这种情况下更简单的方法

    使用unsqueeze 可以更轻松地完成您的工作,如下所示:

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

    0 在维度中的位置。

    关于 libtorch

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

    【讨论】:

    • 非常感谢您的回答。我是从python接触libtorch的新手,在docs中发现的信息很少(和python比较)。我觉得你说得对,我应该先检查类型,遇到问题时再看源码。
    • 如何在另一个给定张量的同一设备中创建张量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多