【问题标题】:std::vector, how does it store values with libtorch tensors?std::vector,它如何使用 libtorch 张量存储值?
【发布时间】:2022-02-14 17:22:43
【问题描述】:

当我以vector<torch::tensor> 收集可训练参数时,我意识到它是类型转换为 torch::autograd::VariableList。

有了这个结构,向量如何访问它的元素?即使不必通过指针或引用显式调用它们,它是否也存储了值的内存空间?

所以我用一些像这样的简单代码进行了测试。 使用常规 int 数据类型:

int a = 10;
std::vector<int> b;
b.push_back(a);
b[0] += 10;
cout << b << endl;
cout << a << endl;

正如预期的那样,这为 b(仅一个元素)生成 20,为 a(原始 int 数据)生成 10

但是,对于torch::Tensor,代码风格相同:

torch::Tensor t = torch::ones({ 1 });
std::vector<torch::Tensor> tv;
tv.push_back(t);
tv[0] += 10;
cout << t << endl;
cout << tv << endl;

就像 int 向量一样,我认为 tv 会产生 11(一个元素向量),而 v 只是 1(形状 1) 但是,tv 和 v 的结果都更新为 11。 虽然是对向量进行了运算,但也更新了原始张量值。为什么会这样? 我的猜测是 torch::autograd::Variable 列表通过内存地址存储其元素...?

另外,当你这样做时,

torch::Tensor t = torch::ones({ 1 });
std::vector<torch::Tensor> tv;
tv.push_back(t);
tv[0] = tv[0] + 10;
cout << t << endl;
cout << tv << endl;

只有 tv 值更新为 11,原始张量 t 相同为 1。

我的意思是这使得收集可训练参数并将它们传递给优化器变得更加容易,但我真的不确定这是怎么发生的。 您能否向我解释一下为什么这些情况都不同,以及向量如何存储每种情况下的元素?

非常感谢您提前提供的帮助!

【问题讨论】:

    标签: c++ vector pytorch std libtorch


    【解决方案1】:

    这不是std::vector 的奇怪行为,而是torch::Tensor 的奇怪行为。以下也应该展示它。

    int a = 10;
    int b = a;
    b += 10;
    std::cout << b << std::endl;
    std::cout << a << std::endl;
    
    torch::Tensor c = torch::ones({ 1 });
    torch::Tensor d = c;
    d += 10;
    std::cout << d << std::endl;
    std::cout << c << std::endl;
    
    torch::Tensor e = torch::ones({ 1 });
    torch::Tensor f = e;
    f = f + 10;
    std::cout << f << std::endl;
    std::cout << e << std::endl;
    

    std::vector&lt;T&gt; 分配一些空间,并在该空间中构造 T 实例。使用的特定构造函数取决于您插入的方式。在您的情况下,push_back 使用该类型的复制构造函数(如果给定右值,它将使用移动构造函数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      相关资源
      最近更新 更多