libtorch:为什么我的张量从一个方法返回到另一个方法时会改变值?

JVE*_*999 1 c++ juce libtorch

我正在调试这个错误:

Unhandled exception at 0x00007FFA0B7D3E49 in AudioPluginHost.exe: Microsoft C++ exception: c10::Error at memory location 0x00000044B4DABDB0.
Run Code Online (Sandbox Code Playgroud)

我正在尝试训练一个神经网络,主要基于这个例子

这就是我正在做的:

torch::Tensor TrainingSample::getRatingTensor()
{
    c10::DeviceType deviceType;
    if (torch::cuda::is_available()) {
        deviceType = torch::kCUDA;
    }
    else {
        deviceType = torch::kCPU;
    }
    float ratingArray[1][3] = { {0} };
    ratingArray[0][(int)waveform.rating] = 1;

    ostringstream os0;
    for (int i = 0;i<(sizeof(ratingArray[0])/sizeof(ratingArray[0][0]));i++) {
        os0 << ratingArray[0][i];
        os0 << ",";
    }
    DBG("ratingArray: \n" + os0.str());

    auto options = torch::TensorOptions().dtype(torch::kFloat32).device(deviceType);
    torch::Tensor ratingTensor = torch::from_blob(ratingArray, { 1, 3 }, options);

    ostringstream os1;
    os1 << ratingTensor[0];
    DBG("ratingTensor: \n" + os1.str());

    return ratingTensor;
}
Run Code Online (Sandbox Code Playgroud)

其结果是:

ratingArray: 
1,0,0,
ratingTensor: 
 1
 0
 0
[ CPUFloatType{3} ]
Run Code Online (Sandbox Code Playgroud)

所以,到目前为止一切都很好。我从同一个类中的另一个方法调用此方法。该方法有这样的代码:

...
        // Execute the model on the input data.
        auto prediction = net->forward(trainingSample.sampleTensor);
        auto target = trainingSample.getRatingTensor();

        std::ostringstream os_tensor0;
        os_tensor0 << target[0];
        DBG("target_val: \n" + os_tensor0.str());

        std::ostringstream os_tensor1;
        os_tensor1 << prediction[0];
        DBG("prediction_val: \n" + os_tensor1.str());

        // Compute a loss value to judge the prediction of our model.
        torch::Tensor loss = torch::nll_loss(prediction, target);
...

Run Code Online (Sandbox Code Playgroud)

我在最后一行收到错误 ( torch::Tensor loss = torch::nll_loss(prediction, target);)。

该代码在控制台中的输出是:

target_val: 
-4.0784e-07
 9.5288e-44
-3.3012e-34
[ CPUFloatType{3} ]
prediction_val: 
-4.2455e+17
-4.6908e+17
 0.0000e+00
[ CPUFloatType{3} ]
Exception thrown at 0x00007FFA0B7D3E49 in AudioPluginHost.exe: Microsoft C++ exception: c10::Error at memory location 0x00000044B4DABDB0.
Unhandled exception at 0x00007FFA0B7D3E49 in AudioPluginHost.exe: Microsoft C++ exception: c10::Error at memory location 0x00000044B4DABDB0.
Run Code Online (Sandbox Code Playgroud)

因此,除了错误之外,我还看到目标的张量值在值内部getRatingTensor()和返回值之后发生变化。是什么导致了这种变化?我想这可能与我遇到的这个错误的原因有关。

我正在尝试从 JUCE 项目运行它,因此我链接了 projucer 中的库并使用 Visual Studio 进行编译。我不确定这些错误是否源于错误的链接或编码错误。

我在投影机中的设置是:

要链接的外部库:

E:\Programming\Downloads\libtorch\lib\c10.lib
E:\Programming\Downloads\libtorch\lib\c10_cuda.lib
E:\Programming\Downloads\libtorch\lib\caffe2_nvrtc.lib
E:\Programming\Downloads\libtorch\lib\torch.lib
E:\Programming\Downloads\libtorch\lib\torch_cpu.lib
E:\Programming\Downloads\libtorch\lib\torch_cuda.lib
Run Code Online (Sandbox Code Playgroud)

标题搜索路径:

E:\Programming\Downloads\libtorch\include\
E:\Programming\Downloads\libtorch\include\torch\csrc\api\include
Run Code Online (Sandbox Code Playgroud)

额外的库搜索路径:

E:\Programming\Downloads\libtorch\lib
Run Code Online (Sandbox Code Playgroud)

tri*_*ror 6

我想说这是因为你使用了,torch::from_blob但我不能确定,因为我目前没有计算机可以测试它。

基本上,torch::from_blob不拥有您提供的基础数据的所有权。这意味着您必须确保数据的寿命至少与 所创建的张量一样长from_blob。在这里,当您返回 时rating_tensor,您将离开该函数,因此所有变量都被清除,因此ratingArray(持有rating_tensor底层数据的所有权)被销毁。因此,您会遇到内存/指针错误。

这应该通过rating_tensor在返回之前简单地克隆来解决:

return rating_tensor.clone();
Run Code Online (Sandbox Code Playgroud)