CNTK c# Wrapper抛出“外部组件抛出异常”.EvalWrapper

本文关键字:组件 抛出异常 EvalWrapper 外部 Wrapper 抛出 CNTK | 更新日期: 2023-09-27 18:18:25

我有CSEvalClientTest的代码。从微软的CNTK在GitHub上。我已经创建了一个新的Visual Studio 2015 c#控制台应用程序,粘贴在代码从CSEvalClientTest。Csproj,修复了引用并使其运行。但它不会走得太远。在这行源代码中:using (var model = new evaluatemodelmanagedf ())它抛出这个异常:

System.Runtime.InteropServices.SEHException was unhandled
  • ErrorCode=-2147467259 HResult=-2147467259 Message=External组件抛出了异常。源= hhCSEvalClientTest
    加:Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.OnGeneralException(例外前女友)E: '工作区' '哈尔' '用户来源hhCSEvalClientTest ' hhCSEvalClientTest ' hhCSEvalClientTest ' Program.cs:行123在Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.EvaluateModelSingleLayer ()在E: '工作区' '哈尔' '用户来源hhCSEvalClientTest ' hhCSEvalClientTest ' hhCSEvalClientTest ' Program.cs:行171Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.Main (String []args)E: '工作区' '哈尔' '用户来源hhCSEvalClientTest ' hhCSEvalClientTest ' hhCSEvalClientTest ' Program.cs:行69在System.AppDomain。_nExecuteAssembly(运行时汇编程序集,字符串[]args)在System.AppDomain。ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()System.Threading.ExecutionContext.RunInternal (ExecutionContextexecutionContext, ContextCallback, callback,对象状态,布尔值preserveSyncCtx)在System.Threading.ExecutionContext。运行ExecutionContext ExecutionContext, ContextCallback callback,对象状态,布尔值preserveSyncCtx)在System.Threading.ExecutionContext。运行(ExecutionContext, ExecutionContext, ContextCallback, callback, Object state)at System.Threading.ThreadHelper.ThreadStart() InnerException:

任何帮助解决这个问题将非常感谢!

CNTK c# Wrapper抛出“外部组件抛出异常”.EvalWrapper

你会为你的c#应用程序使用CNTK Nuget包吗?这将消除有关dll引用的大多数头痛问题。您可以查看https://github.com/Microsoft/CNTK/tree/master/Examples/Evaluation/CSEvalClient中的示例以获取更多信息。

很可能您缺少了一些引用的本机dll。请查看与此相关的SO问题以获取dll列表。这些需要驻留在与主可执行文件相同的目录中。

请注意,您必须为使用EvalWrapper的所有dll或exe添加正确的引用集,这很麻烦。我发现使用您在项目文件中引用的props文件很有帮助。这是我的cntk_evalwrapper.props看起来像(你需要调整你的CNTK构建的位置)

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <None Include="c:/git/cntk/x64/Release_CpuOnly/EvalDll.dll">
      <Link>evaldll.dll</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Include="c:/git/cntk/x64/Release_CpuOnly/EvalDll.lib">
      <Link>EvalDll.lib</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Include="c:/git/cntk/x64/Release_CpuOnly/Math.dll">
      <Link>Math.dll</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Include="c:/git/cntk/x64/Release_CpuOnly/libiomp5md.dll">
      <Link>libiomp5md.dll</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Include="c:/git/cntk/x64/Release_CpuOnly/mkl_cntk_p.dll">
      <Link>mkl_cntk_p.dll</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <Reference Include="EvalWrapper">
      <HintPath>c:/git/cntk/x64/Release_CpuOnly/EvalWrapper.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

在你的项目文件yourproject.csproj中,包括这个道具文件,这样你的项目文件的顶部看起来像:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..'cntk_evalwrapper.props" />

再次调整相对路径,使其正确地从项目文件指向props文件。如果工作正常,一旦重新加载项目,您应该在项目的引用中看到对EvalWrapper的引用