static FunctionPtr CNTK::Function::Load(const std::wstring& modelFile, const DeviceDescriptor& computeDevice = DeviceDescriptor::UseDefaultDevice()
此方法加载模型文件,并返回指向表示已加载模型的函数的指针。 CNTK中的函数表示由基元函数或复合函数组成的计算图,其中包含零个或多个输入参数和一个或多个输出。 modelFile
是模型文件路径。 指定要 computeDevice
运行评估的设备。
static FunctionPtr CNTK::Function::Load(char *modelBuffer, size_t modelBufferLength, const DeviceDescriptor& computeDevice = DeviceDescriptor::UseDefaultDevice()
此方法从内存缓冲区加载模型,并返回指向表示已加载模型的函数的指针。 指向 modelBuffer
包含序列化模型内容的缓冲区,并且 modelBufferLength
是缓冲区长度。 指定要 computeDevice
运行评估的设备。
void CNTK::Function::Evaluate(const std::unordered_map<Variable, ValuePtr>& arguments, std::unordered_map<Variable, ValuePtr>& outputs, const DeviceDescriptor& computeDevice = DeviceDescriptor::UseDefaultDevice()
此方法开始计算 this
表示具有指定参数的模型的函数。 包含 arguments
计算所需的所有输入变量的值,以及 outputs
输出变量的值。 输出值的存储可由调用方预先分配;如果 ValuePtr 映射由调用方传递为 null,则由系统预先分配。 指定要 computeDevice
运行评估的设备。
template <typename ElementType> static ValuePtr CNTK::Value::CreateBatch(const NDShape& sampleShape, const std::vector<ElementType>& batchData, const DeviceDescriptor& device, bool readOnly = false
创建包含一批样本的新 Value 对象。 批中的样本数是除以 (运行时错误的大小sampleShape
除以元素batchData
数(如果余数不是零) )。 创建的 Value 对象包含指定数据 batchData
的副本。 ElementType
是创建的 Value 对象的数据类型。 float
double
目前且受支持。
sampleShape
:Value 对象的张量形状。
batchData
:要包含在 Value 对象中的数据。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则 Value 对象为只读对象。
template <typename ElementType> static ValuePtr CNTK::Value::CreateSequence(const NDShape& sampleShape, const std::vector<ElementType>& sequenceData, const DeviceDescriptor& device, bool readOnly = false
创建包含样本序列的新 Value 对象。 创建的 Value 对象包含指定数据 sequenceData
的副本。 序列长度是除以 (运行时错误的大小sampleShape
除以的元素sequenceData
数(如果余数不是零) )。 创建的序列是一个新序列。 ElementType
是创建的 Value 对象的数据类型。 float
double
目前且受支持。
sampleShape
:Value 的张量形状。
sequenceData
:要包含在 Value 中的数据。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateSequence(const NDShape& sampleShape, const std::vector<ElementType>& sequenceData, bool sequenceStartFlag, const DeviceDescriptor& device, bool readOnly = false
创建包含样本序列的新 Value 对象。 创建的 Value 对象包含指定数据 sequenceData
的副本。 序列长度是除以 (运行时错误的大小sampleShape
除以的元素sequenceData
数(如果余数不是零) )。 sequenceStartFlag 指定此序列是之前调用此方法的序列列表中的同一个索引处的新序列还是上一个序列的延续。 ElementType
是创建的 Value 对象的数据类型。 float
double
目前且受支持。
sampleShape
:Value 的张量形状。
sequenceData
:要包含在 Value 中的数据。
sequenceStartFlag
: true
指示它是一个新序列。 false
表示上一个序列的延续。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateBatchOfSequences(const NDShape& sampleShape, const std::vector<std::vector<ElementType>>& batchOfSequences, const DeviceDescriptor& device, bool readOnly = false
创建包含一批可变长度序列的新 Value 对象。 创建的 Value 对象包含指定数据 batchOfSequences
的副本。 批中的序列数是大小 batchOfSequences
。 每个序列的长度是相应序列 batchOfSequences
sampleShape
中除以 (如果余数不是零) ,则会发生运行时错误。 每个序列 batchOfSequences
都是一个新序列。 ElementType
是创建的 Value 对象的数据类型。 float
double
目前且受支持。
sampleShape
:Value 的张量形状。
batchOfSequences
:要存储在 Value 中的数据。 外部 vector
表示具有可变长度的序列集合,内部 vector
表示每个单独的序列。
device
:应创建值的设备。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateBatchOfSequences(const NDShape& sampleShape, const std::vector<std::vector<ElementType>>& batchOfSequences, const std::vector<bool>& sequenceStartFlags, const DeviceDescriptor& device, bool readOnly = false
创建包含一批可变长度序列的新 Value 对象。 创建的 Value 对象包含指定数据 batchOfSequences
的副本。 批中的序列数是大小 batchOfSequences
。 每个序列的长度是相应序列 batchOfSequences
sampleShape
中除以 (如果余数不是零) ,则会发生运行时错误。 ElementType
是创建的 Value 对象的数据类型。 float
double
目前且受支持。
sampleShape
:Value 的张量形状。
batchOfSequences
:要存储在 Value 中的数据。 外部 vector
表示具有可变长度的序列集合,内部 vector
表示每个单独的序列。
sequenceStartFlags
:布尔值的集合。 每个元素表示在) 时是新序列 batchOfSequences
true
(,还是在) 的情况下 (上一个序列的 false
延续。
device
:应创建值的设备。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateBatch(size_t dimension, const std::vector<size_t>& batchData, const DeviceDescriptor& device, bool readOnly = false)
创建包含一批样本的新 Value 对象。 每个样本都由一个索引值表示,该值指向元素一热向量 dimension
中的非零值。 批中的样本数是批中的 batchData
元素数。 ElementType
是创建的 Value 对象的数据类型。 float
double
目前且受支持。
dimension
:一热向量的尺寸。
batchData
:表示样本批的索引集合。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateSequence(size_t dimension, const std::vector<size_t>& sequenceData, const DeviceDescriptor& device, bool readOnly = false)
创建包含样本序列的新 Value 对象。 每个样本都由一个索引值表示,该值指向元素一热向量 dimension
中的非零值。 序列长度是元素数 sequenceData
。每个序列都是一个新序列。 ElementType
是创建的 Value 对象的数据类型。 float
double
目前且受支持。
dimension
:一热向量的尺寸。
sequenceData
:表示样本序列的索引集合。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateSequence(size_t dimension, const std::vector<size_t>& sequenceData, bool sequenceStartFlag, const DeviceDescriptor& device, bool readOnly = false)
创建一个新的 Value 对象,其中包含一系列示例。 每个示例都由指向元素一热向量 dimension
中的非零值的索引值表示。 seqStartFlag 指定此序列是之前调用此方法的同一个索引中上一个序列的新序列还是上一个序列的延续。 序列长度是元素数 sequenceData
。 ElementType
是创建的 Value 对象的数据类型。 float
目前受double
支持。
dimension
:一热向量的尺寸。
sequenceData
:表示样本序列的索引集合。
sequenceStartFlag
: true
指示它是一个新序列。 false
表示上一序列的延续。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateBatchOfSequences(size_t dimension, const std::vector<std::vector<size_t>>& batchOfSequences, const DeviceDescriptor& device, bool readOnly = false
创建一个新的 Value 对象,其中包含一批可变长度序列。 每个示例都由指向元素一热向量 dimension
中的非零值的索引值表示。 序列数是外部列表中的 batchOfSequences
元素数。 每个序列的长度是内部列表中 batchOfSequences
相应序列的元素数。 每个序列 batchOfSequences
都是一个新序列。 ElementType
是创建的 Value 对象的数据类型。 float
目前受double
支持。
dimension
:一热向量的尺寸。
batchOfSequences
:表示样本序列的索引集合。 外部 vector
表示具有可变长度的序列集合,内部 vector
表示每个单独的序列。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateBatchOfSequences(size_t dimension, const std::vector<std::vector<size_t>>& batchOfSequences, const std::vector<bool>& sequenceStartFlags, const DeviceDescriptor& device, bool readOnly = false
创建一个新的 Value 对象,其中包含一批可变长度序列。 每个示例都由指向元素一热向量 dimension
中的非零值的索引值表示。 序列数是外部列表中的 batchOfSequences
元素数。 每个序列的长度是内部列表中 batchOfSequences
相应序列的元素数。 ElementType
是创建的 Value 对象的数据类型。 float
目前受double
支持。
dimension
:一热向量的尺寸。
batchOfSequences
:表示样本序列的索引集合。 外部 vector
表示具有可变长度的序列集合,内部 vector
表示每个单独的序列。
sequenceStartFlags
:布尔值的集合。 每个元素表示在) 时是新序列 batchOfSequences
true
(,还是) 之前序列的 false
延续 (。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
目前支持压缩稀疏列格式 (CSC) 。 CSC 格式以列主格式存储矩阵,并且压缩包含列索引的数组。 CSC 格式的矩阵由以下参数表示:
nonZeroValues
:以列主格式保存矩阵的所有非零值的数据数组。
rowIndices
:包含数组中相应元素的行索引的数组 nonZeroValues
。
colStarts
:将索引保存到数组和nonZeroValues
数组中的数组rowIndices
。
可 在此处找到 CSC 格式的详细说明。
template <typename ElementType> static ValuePtr CNTK::Value::CreateSequence(const NDShape& sampleShape, size_t sequenceLength, const SparseIndexType* colStarts, const SparseIndexType* rowIndices, const ElementType* nonZeroValues, size_t numNonZeroValues, const DeviceDescriptor& device, bool readOnly = false
使用 CSC 稀疏输入格式创建包含样本序列的新 Value 对象。 序列长度是稀疏矩阵的行数。 创建的序列是一个新序列。 ElementType
是创建的 Value 对象的数据类型。 float
目前受double
支持。
sampleShape
:Value 的张量形状。 对于稀疏输入,张量形状前导维必须与张量形状的总大小相同。
sequenceLength
:序列长度,也是稀疏矩阵中的行数。
colStarts
:数组将每个列的索引保留到数组rowIndices
中,nonZeroValues
rowIndices
:包含数组中相应元素的行索引的数组 nonZeroValues
。
nonZeroValues
:保存稀疏矩阵中所有非零值的数组。
numNonZeroValues
:稀疏矩阵中的非零值数。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateSequence(const NDShape& sampleShape, size_t sequenceLength, const SparseIndexType* colStarts, const SparseIndexType* rowIndices, const ElementType* nonZeroValues, size_t numNonZeroValues, bool sequenceStartFlag, const DeviceDescriptor& device, bool readOnly = false
使用 CSC 稀疏输入格式创建包含样本序列的新 Value 对象。 序列长度是稀疏矩阵的行数。 sequenceStartFlag 指定此序列是以前对此方法的调用中的上一个序列的新序列还是延续。 ElementType
是创建的 Value 对象的数据类型。 float
目前受double
支持。
sampleShape
:Value 的张量形状。 对于稀疏输入,张量形状前导维必须与张量形状的总大小相同。
sequenceLength
:序列长度,也是稀疏矩阵中的行数。
colStarts
:数组将每个列的索引保留到数组rowIndices
中,nonZeroValues
rowIndices
:包含数组中相应元素的行索引的数组 nonZeroValues
。
nonZeroValues
:保存稀疏矩阵中所有非零值的数组。
numNonZeroValues
:稀疏矩阵中的非零值数。
sequenceStartFlag
: true
指示它是一个新序列。 false
表示上一序列的延续。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateSequence(size_t dimension, size_t sequenceLength, const SparseIndexType* colStarts, const SparseIndexType* rowIndices, const ElementType* nonZeroValues, size_t numNonZeroValues, const DeviceDescriptor& device, bool readOnly = false
使用 CSC 稀疏输入格式创建包含样本序列的新 Value 对象。 序列长度是稀疏矩阵的行数。 创建的序列是一个新序列。 ElementType
是创建的 Value 对象的数据类型。 float
目前受double
支持。
dimension
:一热向量的尺寸。
sequenceLength
:序列长度,也是稀疏矩阵中的行数。
colStarts
:数组将每个列的索引保留到数组rowIndices
中,nonZeroValues
rowIndices
:包含数组中相应元素的行索引的数组 nonZeroValues
。
nonZeroValues
:保存稀疏矩阵中所有非零值的数组。
numNonZeroValues
:稀疏矩阵中的非零值数。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
template <typename ElementType> static ValuePtr CNTK::Value::CreateSequence(size_t dimension, size_t sequenceLength, const SparseIndexType* colStarts, const SparseIndexType* rowIndices, const ElementType* nonZeroValues, size_t numNonZeroValues, bool sequenceStartFlag, const DeviceDescriptor& device, bool readOnly = false
使用 CSC 稀疏输入格式创建包含样本序列的新 Value 对象。 序列长度是稀疏矩阵的行数。 sequenceStartFlag 指定此序列是新序列还是上一序列的延续。 ElementType
是创建的 Value 对象的数据类型。 float
目前受double
支持。
dimension
:一热向量的尺寸。
sequenceLength
:序列长度,也是稀疏矩阵中的行数。
colStarts
:数组将每个列的索引保留到数组rowIndices
中,nonZeroValues
rowIndices
:包含数组中相应元素的行索引的数组 nonZeroValues
。
nonZeroValues
:保存稀疏矩阵中所有非零值的数组。
numNonZeroValues
:稀疏矩阵中的非零值数。
sequenceStartFlag
: true
指示它是一个新序列。 false
表示上一序列的延续。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
从 NDArrayView 创建值
static ValuePtr CNTK::Value::Create(const NDShape& sampleShape, const std::vector<NDArrayViewPtr>& sequences, const DeviceDescriptor& device, bool readOnly = false
基于 NDArrayViews 的集合创建新的 Value 对象。 每个序列 sequences
都是一个新序列。
sampleShape
:正在创建的 Value 的张量形状。
sequences
:NDArrayView 表示的序列集合。 每个 NDArrayView 表示一个序列。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
static ValuePtr CNTK::Value::Create(const NDShape& sampleShape, const std::vector<NDArrayViewPtr>& sequences, const std::vector<bool>& sequenceStartFlags, const DeviceDescriptor& device, bool readOnly, bool createNewCopy
基于 NDArrayViews 的集合创建新的 Value 对象。 sequenceStartFlags 指定序列是新序列还是上一个序列的延续。
sampleShape
:正在创建的 Value 的张量形状。
sequences
:NDArrayView 表示的序列集合。 每个 NDArrayView 表示一个序列。
sequenceStartFlags
:布尔值的集合。 每个元素表示在) 时是新序列 sequences
true
(,还是) 之前序列的 false
延续 (。
device
:应在哪个设备上创建 Value 对象。
readOnly
:如果此标志为 true
,则值为只读。
从 Value 对象复制数据
template <typename ElementType> void CNTK::Value::CopyVariableValueTo(const Variable& outputVariable, std::vector<std::vector<ElementType>>& sequences
将存储在 Value 中的数据复制到提供的 sequences
缓冲区中。 sequences
是具有可变长度的序列列表。 外部列表中的 sequences
项数是 Value 中的序列数。 外部列表的每个元素都表示一个序列。 Each sequence, represented by vector<ElementType>
, contains a variable number of samples. 每个示例由类型为 的固定数量的元素 ElementType
组成。 样本的元素数由形状 outputVariable
确定。 变量的形状应与 Value 的形状匹配。 ElementType
是创建的 Value 对象的数据类型。 float
目前受double
支持。
outputVariable
:在将数据从此值复制到此值 sequences
时,表示形状和动态轴。
sequences
:用于存储从值复制的数据的输出缓冲区。
void CNTK::Value::CopyVariableValueTo(const Variable& outputVariable, std::vector<std::vector<size_t>>& sequences
将 Value 对象中存储的数据复制到提供的 sequences
缓冲区中。 sequences
是具有可变长度的序列列表。 外部列表中的 sequences
项数是 Value 中的序列数。 外部列表的每个元素都表示一个序列。 Each sequence, represented by vector<size_t>
, contains a variable number of samples. 每个样本由指向一热向量中的非零值的索引表示。 一热向量的大小应与在中 outputVariable
定义的维度大小匹配。
outputVariable
:在将数据从此值复制到此值 sequences
时,表示形状和动态轴。
sequences
:用于存储从值复制的数据的输出缓冲区。
template <typename ElementType> void CopyVariableValueTo(const Variable& outputVariable, size_t& sequenceLength, std::vector<SparseIndexType>& colStarts, std::vector<SparseIndexType>& rowIndices, std::vector<ElementType>& nonZeroValues, size_t& numNonZeroValues)
将存储在 Value 对象中的数据复制到表示 CSC 稀疏格式序列的缓冲区。 如有必要,将调整序列缓冲区的大小。 Value 应具有与 outputVariable 相同的张量形状。 返回时,sequenceLength
设置为值中存储的序列的长度,并且colStarts
rowIndices
包含nonZeroValues
列开始索引、行索引和非零值的数据,并numNonZeroValues
设置为 Value 中包含的非零值this
数。
outputVariable
:表示将数据从此值复制到缓冲区时的形状和动态轴。
sequenceLength
:返回时,它设置为值中存储的序列的长度。
colStarts
:返回时,它将索引包含在 nonZeorValues
矩阵的每个列的第一个非零元素中。
rowIndices
:返回时,它包含矩阵的每个非零元素的行索引。
nonZeroValues
:返回时,它包含矩阵的所有非零元素的值。
numNonZeroValues
:返回时,返回矩阵的非零元素数。
用于操作要评估的函数的帮助程序函数
FunctionPtr CNTK::Function::Clone(ParameterCloningMethod parameterCloneMethod = ParameterCloningMethod::Clone, const std::unordered_map<Variable, Variable>& replacements = {}) const
对于评估,此方法调用以创建克隆的函数,然后可由另一个线程用来评估同一模型。 为此, parameterCloneMethod
应将其设置为其默认值 ParameterCloningMethod::Share
。 该参数 replacements
指定在克隆的 Function 实例中应用的任何变量替换,并且通常不需要进行计算。
FunctionPtr CNTK::Function::FindByName(const std::wstring& name, bool nestedSearchInsideBlockFunction = false
查找函数图基础“this”函数中给定 name
的函数。 如果有多个具有相同名称的函数存在,则会引发异常。 如果 nestedSearchInsideBlockFunction
为 true,则还会搜索块函数中的所有函数。
std::vector<FunctionPtr> CNTK::Function::FindAllWithName(const std::wstring& name, bool nestedSearchInsideBlockFunction = false
查找函数图基础“this”函数中给定 name
的函数列表。 如果 nestedSearchInsideBlockFunction
为 true,则还会搜索块函数中的所有函数。
FunctionPtr CNTK::Combine(const std::vector<Variable>& operands, const std::wstring& name = L""
创建一个新的函数实例,该实例合并函数的指定“操作数”列表的输出。 新的“函数”的“输出”是每个指定“操作数”函数的“输出”的联合。 例如,创建分类模型时,通常 CrossEntropy loss Function 和 ClassificationError 函数构成计算图的根,该图可以“合并”以创建包含 2 个输出的单个函数:即。 CrossEntropy loss 和 ClassificationError 输出。
FunctionPtr CNTK::AsComposite(const FunctionPtr& rootFunction, const std::wstring& name = L""
创建具有指定 rootFunction
为其根的复合函数。 复合表示一个更高级别的函数,该函数封装了指定 rootFunction
函数的整个图形。
FunctionPtr CNTK::Alias(const Variable& operand, const std::wstring& name = L""
创建一个新的函数实例,该实例只是指定的 operand
别名。
有关上述函数使用的数据类型的详细信息,请参阅 CNTKLibrary.h 。
C++ 示例 CNTKLibraryCPPEvalCPUOnlyExamples 和 CNTKLibraryCPPEvalGPUExamples 演示了使用 CNTK 库进行评估。 这些示例还演示如何使用多个线程并行执行多个评估,并在线程之间共享模型参数。