0

我正在尝试调整本教程以使用我自己的神经网络和图像。我可以在我的 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(...)队列后立即抛出A。我认为这意味着bindings在某种程度上是无效的......但是(a)我不确定并且(b)我不知道该怎么做才能使它有效。帮助?

编辑:我现在可以让 MS 样本工作,但不是我的适应。当我使用Netron查看 MS 示例 .onnx 文件时,输入和输出节点具有合理的名称,并且报告的张量大小也是合理的。在我尝试使用的模型上,输入和输出节点都有“:0”作为它们名称的最后一部分,并且张量大小有一个“未知”大小,例如输入大小报告为“unk_123 x 3 x 224 x 224"。这些中的任何一个都会产生任何不兼容性吗?网络是提供给我的,所以我想在要求之前了解是否需要更改...

4

1 回答 1

0

这一切都按预期工作。在尝试使 Windows ML 代码适应我的要求时多次失败,我强烈的建议是:

  • 仔细检查所有内容 - 使用调试器来证明变量包含您认为它们在设置的每个步骤中所做的事情。

例如,为了响应 EDIT 部分,问题是复制/粘贴/编辑代码,在需要时将输出形状从 1 x 1000 x 1 x 1(已粘贴)更改为 1 x 10 x 1 x 1(已编辑)是 1 x 10。这是按照我上面自己的建议检测到的 :-)

我可以确认设置deviceKind = LearningModelDeviceKind::DirectX是调用 GPU 的原因,但这样做可能不会显着提高速度。

于 2021-02-03T23:03:30.270 回答