提问人:columbia313131 提问时间:2/11/2022 更新时间:2/14/2022 访问量:690
std::vector,它如何使用 libtorch 张量存储值?
std::vector, how does it store values with libtorch tensors?
问:
当我收集可训练参数时,我意识到它是类型转换为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。
我的意思是,这使得收集可训练参数并将它们传递给优化器变得更加容易,但我真的不确定这是如何发生的。 您能否向我解释为什么这些情况都不同,以及向量如何在每种情况下存储元素?
非常感谢您的帮助!
答:
1赞
Caleth
2/14/2022
#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;
A 分配一些空间,并在该空间中构造实例。使用的特定构造函数取决于插入方式。在您的例子中,使用类型的复制构造函数(如果给定右值,它将使用移动构造函数)。std::vector<T>
T
push_back
评论