std::vector,它如何使用 libtorch 张量存储值?

std::vector, how does it store values with libtorch tensors?

提问人:columbia313131 提问时间:2/11/2022 更新时间:2/14/2022 访问量:690

问:

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

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

因此,我用一些简单的代码进行了测试,例如。 使用常规 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 list 按内存地址存储其元素......?

另外,当你这样做时,

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++ 矢量 pytorch std libtorch

评论


答:

1赞 Caleth 2/14/2022 #1

这不是奇怪的行为,而是奇怪的行为。以下也应展示它。std::vectortorch::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;

A 分配一些空间,并在该空间中构造实例。使用的特定构造函数取决于插入方式。在您的例子中,使用类型的复制构造函数(如果给定右值,它将使用移动构造函数)。std::vector<T>Tpush_back