【发布时间】: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