【问题标题】:Programming syntax questionin usage of CNTKLibrary from C++C++ CNTKLibrary 的编程语法问题
【发布时间】:2017-05-01 04:52:50
【问题描述】:

这只是一个 C++ 编程语法问题(我认为)。我有 192 个浮点数,结构如下:

std::vector outputData(192);

我想在这个192x1的向量上调用CNTKLibrary中内置的Softmax函数——头文件中的文档是:

/// 在指定的张量输入操作数上创建 CNTK 内置 softmax 操作的实例 CNTK_API FunctionPtr Softmax(const Variable& 操作数, const std::wstring& name = L"");

我该怎么做?我想首先我得到函数指针,然后我应用它,但我不明白语法是什么。像这样的……

// 抓取 Softmax 函数指针

FunctionPtr SoftmaxFuncPtr = Softmax(outputData); // 如何转换 arg?

// 如何评估这个FuntionPtr?

SoftmaxFuncPtr->eval(); // WAG - 我不知道...

计算结果去哪了?

谢谢你能给我一些提示...

【问题讨论】:

  • 请阅读this,然后确保您的问题看起来像您想要的那样。使用编辑字段下方的预览窗格。

标签: c++ cntk


【解决方案1】:

首先你需要为 Softmax 的输入定义一个变量,比如:

auto inputVar = InputVariable(DimensionsOfInput, DataType::Float, L"InputSoftMax");

然后,您使用 Softmax 构建一个复合函数,例如

FunctionPtr SoftmaxFuncPtr = Softmax(inputVar, L"SoftMax"); 
auto EvalFuncPtr = AsComposite(SoftmaxFuncPtr, L"EvalSoftMax");

之后,构造输入输出map,准备求值数据,然后调用Forward()或Evaluate()对输入数据进行求值,得到输出结果。

EvalMultithreads.cpp 中的示例 MultiThreadsEvaluationWithNewFunction() 展示了如何创建新的评估函数。 page 描述了如何使用这些示例。那里的函数包含多个层并支持使用多线程进行评估,因此它可能包含一些您的情况不需要的代码。并且示例仍然使用低级 API 来操作输入和输出数据,并且我们还有高级便捷方法,例如 Value::CreateBatch/Sequence/BatchOfSequence()、Value::CopyVariableValueTo() 来帮助您准备输入/输出数据而不知道低级细节。 CNTKLibrary.h 也有这些 APIS 的描述。

如果您有任何问题,请告诉我们。 谢谢,

【讨论】:

  • 嗯...好吧,我正在尝试找出所有的语法和含义...这似乎很复杂,因为 CNTK 都设置为允许任意张量等。我真的喜欢这样打电话:std:vector answer = softmax(outputData);但似乎我需要做类似的事情(见下一篇文章)......
  • // 定义一个输入变量 NDShape DimensionsOfInput(1, ntot);自动 inputVar = InputVariable(DimensionsOfInput, DataType::Float, L"InputSoftMax"); std::vector inputData(inputVar.Shape().TotalSize()); // 用数据填充输入变量 for (i = 0; i GetAt(i); } // 构建复合函数 FunctionPtr SoftmaxFuncPtr = Softmax(inputVar, L"SoftMax");自动 EvalFuncPtr = AsComposite(SoftmaxFuncPtr, L"EvalSoftMax"); ...继续...
  • // 创建输入 ValuePtr ValuePtr inputValue = MakeSharedObject(MakeSharedObject(inputVar.Shape(), inputData, true)); // 我需要 'SharedObject" 吗? // 创建输出 ValuePtr ValuePtr outputValue; auto outputVar = EvalFuncPtr->Output(); std::unordered_map outputs = { {outputVar, outputValue} }; // 应用function EvalFuncPtr->Forward({ { inputVar, inputValue } }, outputs); // 获取输出值 outputValue = outputs[outputVar]; // 做些别的事情来从 outputValue 中提取 outputData 数组
  • 提供数据映射的另一个原因是一个Function可以有多个输入(Softmax只有一个),所以需要指定哪些数据映射到哪个变量。并且 API 支持评估批量数据、序列数据或批量序列,因此调用者需要指定如何处理其数据。提供 CreateBatch()、CreateSequence() 和 CreateBatchOfSequence() 方法来帮助用户从输入的普通数据创建不同类型的输入值。使用这些方法,您可以避免处理 NDArrayView 和其他低级类型。
  • 您可以在此处 (github.com/Microsoft/CNTK/blob/master/Examples/Evaluation/…) 找到在 C# 中使用这些方法的示例。在 C++ 中的用法非常相似(我们希望尽快提供在 C++ 中使用这些方法的示例)。如果您有任何改进 API 的建议,请告诉我们。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多