问题描述
我正在尝试改编this tutorial以使用我自己的神经网络和图像。我可以在cpu上执行此操作,但是我无法使用未更改的教程或对其进行改编的操作是使用GPU。根据系统信息,我有一台“ NVIDIA Quadro P2200”,而不是我需要告知的任何地方。相反,似乎我所需要做的就是替换:
LearningModelDeviceKind deviceKind = LearningModelDeviceKind::Default;
具有:
LearningModelDeviceKind deviceKind = LearningModelDeviceKind::DirectX;
执行此操作时,出现以下异常:
auto results = session.Evaluate(binding,L"RunId");
构造第二个参数后,它会落入:
template <typename D> WINRT_IMPL_AUTO(Windows::AI::MachineLearning::LearningModelEvaluationResult) consume_Windows_AI_MachineLearning_ILearningModelSession<D>::Evaluate(Windows::AI::MachineLearning::LearningModelBinding const& bindings,param::hstring const& correlationId) const
{
void* result{};
check_hresult(WINRT_IMPL_SHIM(Windows::AI::MachineLearning::ILearningModelSession)->Evaluate(*(void**)(&bindings),*(void**)(&correlationId),&result));
return Windows::AI::MachineLearning::LearningModelEvaluationResult{ result,take_ownership_from_abi };
}
踏入winrt::hresult_error
行时,立即抛出check_hresult(...)
。我认为这意味着bindings
在某种程度上是无效的……但是(a)我不确定,并且(b)我不知道该怎么做才能使其有效。帮助吗?
解决方法
一切都按预期工作。在尝试使 Windows ML 代码适应我的要求时多次失败,我的强烈建议是:
- 仔细检查所有内容 - 使用调试器来证明变量包含您认为它们在设置的每个步骤中执行的操作。
例如,为了响应 EDIT 部分,问题是复制/粘贴/编辑的代码将输出形状从 1 x 1000 x 1 x 1(粘贴)更改为 1 x 10 x 1 x 1(编辑)时它需要是 1 x 10。这是按照我上面的建议检测到的:-)
我可以确认设置 deviceKind = LearningModelDeviceKind::DirectX
是调用 GPU 的原因,但您可能不会因此而获得任何明显的速度提升。