在 libtorch C++ 的 while 循环中创建和销毁张量
Tensor creation and destruction within a while loop in libtorch C++
我刚开始使用 libtorch,我在使用 while 循环和张量时遇到了一些问题:roll_eyes:
所以,我的主要功能看起来像这样:
int main()
{
auto tensor_create_options = torch::TensorOptions().dtype(torch::kFloat32).device(torch::kCPU).requires_grad(false);
torch::Tensor randn_tensor = torch::randn({10}, tensor_create_options);
int randn_tensor_size = randn_tensor.sizes()[0];
while (randn_tensor_size > 5)
{
std::cout << "==> randn_tensor shape: " << randn_tensor.sizes() << std::endl;
randn_tensor.reset(); //reset();
torch::Tensor randn_tensor = torch::randn({3}, tensor_create_options);
std::cout << "==> randn_tensor shape 3: " << randn_tensor.sizes() << std::endl;
randn_tensor_size--;
}
return 0;
}
我被抛出这个:
==> randn_tensor shape: [10]
==> randn_tensor shape 3: [3]
terminate called after throwing an instance of 'c10::Error'
what(): sizes() called on undefined Tensor
本质上,我想做的是在 while 循环中重新创建张量,并确保我可以在 while 循环中再次访问它。
有趣的是,它似乎已经确定了缩小尺寸的张量,但 while 循环似乎没有识别出这一点。
谢谢!
你这里有阴影问题,试试这个循环:
while (randn_tensor_size > 5)
{
std::cout << "==> randn_tensor shape: " << randn_tensor.sizes() << std::endl;
randn_tensor.reset(); //reset();
randn_tensor = torch::randn({3}, tensor_create_options);
std::cout << "==> randn_tensor shape 3: " << randn_tensor.sizes() << std::endl;
randn_tensor_size--;
}
也许,张量的重置不再是必要的,取决于这个 class 的内部结构。如果这不是您的代码的实际意图,并且您只想删除原始张量,则只需在循环之前重置该张量即可。独立于此,在意图强调方面尽量使代码更清晰!我真的不明白你到底想达到什么目的。您的循环计数器完全被误用了,因为您混合了大小和计数语义,仅取决于初始大小。在循环中,您只需一次又一次地在堆栈上重新创建张量,而不会影响您的计数器。
我刚开始使用 libtorch,我在使用 while 循环和张量时遇到了一些问题:roll_eyes: 所以,我的主要功能看起来像这样:
int main()
{
auto tensor_create_options = torch::TensorOptions().dtype(torch::kFloat32).device(torch::kCPU).requires_grad(false);
torch::Tensor randn_tensor = torch::randn({10}, tensor_create_options);
int randn_tensor_size = randn_tensor.sizes()[0];
while (randn_tensor_size > 5)
{
std::cout << "==> randn_tensor shape: " << randn_tensor.sizes() << std::endl;
randn_tensor.reset(); //reset();
torch::Tensor randn_tensor = torch::randn({3}, tensor_create_options);
std::cout << "==> randn_tensor shape 3: " << randn_tensor.sizes() << std::endl;
randn_tensor_size--;
}
return 0;
}
我被抛出这个:
==> randn_tensor shape: [10]
==> randn_tensor shape 3: [3]
terminate called after throwing an instance of 'c10::Error'
what(): sizes() called on undefined Tensor
本质上,我想做的是在 while 循环中重新创建张量,并确保我可以在 while 循环中再次访问它。
有趣的是,它似乎已经确定了缩小尺寸的张量,但 while 循环似乎没有识别出这一点。
谢谢!
你这里有阴影问题,试试这个循环:
while (randn_tensor_size > 5)
{
std::cout << "==> randn_tensor shape: " << randn_tensor.sizes() << std::endl;
randn_tensor.reset(); //reset();
randn_tensor = torch::randn({3}, tensor_create_options);
std::cout << "==> randn_tensor shape 3: " << randn_tensor.sizes() << std::endl;
randn_tensor_size--;
}
也许,张量的重置不再是必要的,取决于这个 class 的内部结构。如果这不是您的代码的实际意图,并且您只想删除原始张量,则只需在循环之前重置该张量即可。独立于此,在意图强调方面尽量使代码更清晰!我真的不明白你到底想达到什么目的。您的循环计数器完全被误用了,因为您混合了大小和计数语义,仅取决于初始大小。在循环中,您只需一次又一次地在堆栈上重新创建张量,而不会影响您的计数器。