我正在调试这个错误:
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)
我想说这是因为你使用了,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)