CNTK Library C# API
The CNTK Library Managed API is implemented in C#, and can be consumed by C# and other .NET languages. The page Using the CNTK Library Managed API and Using CNTK with C# present how to use this API in your application. The following sections describe the classes and methods of the CNTK Library Managed Eval API.
class CNTKLib
This is a static class contains many operations, initialization, and many miscellaneous methods.
public static Function Negate(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise negate operation with the specified input operand. Parameters:
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Sigmoid(Variable operand, string name = "")
Sigmoid operation. It takes a input variable and applies Sigmoid operation to it.
Parameters:
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Tanh(Variable operand, string name)
Tanh activation. It takes a input variable and applies Tanh operation to it.
Parameters:
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Asin(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise asin operation with the specified input operand.
Parameters:
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Sin(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise sine operation with the specified input operand. Parameters:
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Acos(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise acos operation with the specified input operand.
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Cos(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise cosine operation with the specified input operand.
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Cosh(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise cosh operation with the specified input operand.
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Sinh(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise sinh operation with the specified input operand.
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function ReLU(Variable operand, string name = "")
Rectifier linear activation. It takes a input variable and applies rectifier linear activation operation to it.
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Exp(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise exp operation with the specified input operand.
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Log(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise log operation with the specified input operand.
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Square(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise square operation with the specified input operand.
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Sqrt(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise square-root operation with the specified input operand.
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Softmax(Variable operand, Axis axis, string name = "")
Create an instance of the CNTK built-in softmax operation on specified axis on a specified tensor input operand Parameters:
operand
: The input variable of the operation. It can be the ouput of another function.axis
: The axis to apply softmax operationname
: the name of the operation.
public static Function Hardmax(Variable operand, string name = "");
Create an instance of the CNTK built-in hardmax operation on specified tensor input operand
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Transpose(Variable operand, string name = "");
Create an instance of the CNTK built-in transpose operation on the specified 1D or 2D input operand
operand
: The input variables. It can be the ouput of another function.name
: the name of the operation.
public static Function Dropout(Variable operand, dropoutRate, uint seed, string name = "");
Create an instance of the dropout operation on specified tensor input operand
operand
: The input variables. It can be the ouput of another function.dropoutRate
:seed
:name
: the name of the operation.
public static Function Reshape(Variable operand, NDShape replacementShape, Axis beginAxis, Axis endAxis, string name = "");
Create an instance of the reshape operation on specified tensor input operand
public static Function Times(Variable leftOperand, Variable rightOperand, string name = "");
Create an instance of the CNTK built-in tensor multiplication operation with the specified input operands.
public static Function TransposeTimes(Variable leftOperand, Variable rightOperand, uint outputRank, string name = "");
Create an instance of the CNTK built-in matrix multiplication operation with the transpose of the left input operand and the specified right operand. Only accepts left operands of ranks 1 or 2.
public static Function Plus(Variable leftOperand, Variable rightOperand, string name = "")
A binary elementwise tensor addition operation. Parameters:
leftOperand
: The left variable of the plus operation. It can be the ouput of another function.rightOperand
: The left variable of the plus operation. It can be the ouput of another function.name
: the name of the operation.
public static Function Minus(Variable leftOperand, Variable rightOperand, string name = "");
Create an instance of the CNTK built-in elementwise tensor subtraction operation with the specified input operands.
public static Function LogAddExp(Variable leftOperand, Variable rightOperand, string name = "");
Create an instance of the CNTK built-in elementwise tensor operation that computes the log of the sum of the exponentials of the specified input operands.
public static Function Pow(Variable leftOperand, Variable rightOperand, string name = "");
Create an instance of the CNTK built-in elementwise tensor operation that computes the leftOperand raised to the power of the right operand.
public static Function ElementTimes(Variable leftOperand, Variable rightOperand, string name = "");
Create an instance of the CNTK built-in elementwise multiplication operation on specified tensor input operands.
public static Function ElementDivide(Variable leftOperand, Variable rightOperand, string name = "");
Create an instance of the CNTK built-in elementwise division operation on specified tensor input operands.
public static Function CosineDistance(Variable leftOperand, Variable rightOperand, string name = "");
Create an instance of the CNTK built-in operation to compute the cosine distance for the specified input operands.
public static Function CosineDistanceWithNegativeSamples(Variable leftOperand, Variable rightOperand, uint shiftWindow, uint numberOfNegativeSamples, string name = "");
Create an instance of the CNTK built-in operation to compute the cosine distance with negative samplesfor the specified input operands.
public static Function BinaryCrossEntropy(Variable prediction, Variable targets, string name = "");
Create an instance of the CNTK built-in operation to compute binary cross-entropy for specified input operands.
public static Function WeightedBinaryCrossEntropy(Variable prediction, Variable targets, Variable weights, string name = "");
Create an instance of the CNTK built-in operation to compute weighted binary cross-entropy for specified input operands.
public static Function CrossEntropyWithSoftmax(Variable prediction, Variable labels, Axis axis, string name = "");
Create an instance of the CNTK built-in operation to compute cross-entropy with softmax for specified input operands.
public static Function ClassificationError(Variable prediction, Variable labels, uint topN, Axis axis, string name = "");
Create an instance of the CNTK built-in operation for computing the classification prediction error for specified operands.
public static Function PastValue(Variable operand, Variable initialState, uint offset = 1, string name = "");
Create an instance of the CNTK built-in operation for getting the past value along the lone dynamic axis of the specified operand.
public static Function FutureValue(Variable operand, Variable initialState, uint offset = 1, string name = "");
Create an instance of the CNTK built-in operation for getting the future value along the lone dynamic axis of the specified operand.
public static Function Convolution(Variable convolutionMap,
Variable operand,
NDShape strides = { 1 },
BoolVector sharing = { true },
BoolVector autoPadding = { true },
NDShape dilation = { 1 },
uint reductionRank = 1,
uint maxTempMemSizeInSamples = 0,
string name = "");
Convolution
public static Function ROIPooling(Variable operand,
Variable rois,
PoolingType poolingType,
NDShape roiOutputShape,
double spatialScale,
string name= "");
Create an instance of the CNTK built-in ROI pooling operation on specified tensor input operands with the specified output shape
public static Function Pooling(Variable operand,
PoolingType poolingType,
NDShape poolingWindowShape,
NDShape strides = {1},
BoolVector autoPadding = {false},
const bool ceilOutDim = false,
const bool includePad = false,
string name = "");
public static Function BatchNormalization(Variable operand,
Variable scale,
Variable bias,
Variable runningMean,
Variable runningInvStd,
Variable runningCount,
bool spatial,
double normalizationTimeConstant = 0,
double blendTimeConstant = 0,
double epsilon = 0.00001,
bool useCuDNNEngine = true,
string name = "");
public static Function Splice(VariableVector operands, Axis axis, string name = "");
Create an instance of the CNTK built-in splice operation to splice together all the specified tensor operands into a single output tensor
public static Function Combine(VariableVector operands, string name = "");
Create a new Function instance which just combines the outputs of the specified list of 'operands' Functions such that the 'Outputs' of the new 'Function' are union of the 'Outputs' of each of the specified 'operands' Functions. E.g. When creating a classification model, typically the CrossEntropy loss Function and the ClassificationError Function comprise the two roots of the computation graph which can be "Combined" to create a single Function with 2 outputs; viz. CrossEntropy loss and ClassificationError output.
public static Function LeakyReLU(Variable operand, string name = "");
Create an instance of the CNTK built-in elementwise leaky linear rectifier operation with the specified input operand.
class Learner
class Function
A Function
denotes a symbolic computation with zero or more input arguments and one or more outputs. A Function may be primitive or composite (comprised of other Function instances whose inputs and outputs are wired together). A Function effectively is a computation graph composed of other primitive Functions (denoting computation) as nodes and Variable
objects (denoting data) as the edges and leaves of the graph.
The Function
class contains the following properties and methods that are relevant to evaluation:
public string Name { get; }
Name of the Function.
public IList<Variable> Arguments { get; }
List of all input Variables of the Function that are not of type Parameter or Constant. These Variables are required inputs in order to compute the outputs of the Function.
public Variable Output { get; }
The single output Variable of the Function, if there is only one. Otherwise a runtime exception is raised on access.
public IList<Variable> Outputs { get; }
List of all output Variables of the Function.
public Function RootFunction { get; }
Returns the primitive Function at the root of the graph of Functions underlying the Function. If the Function itself is a primitive Function, then (this->RootFunction() == this).
public string OpName { get; }
The name of the operation that the Function denotes.
public bool IsComposite { get; }
A boolean value indicating whether the Function is a composite Function.
public bool IsPrimitive { get; }
A boolean value indicating whether the Function is a primitive Function.
public bool IsBlock { get; }
A boolean value indicating whether the Function is a block Function.
public void Evaluate(IDictionary<Variable, Value> inputs, IDictionary<Variable, Value> outputs, DeviceDescriptor computeDevice)
public void Evaluate(IDictionary<Variable, Value> inputs, IDictionary<Variable, Value> outputs, bool createPersistentOutputValues, DeviceDescriptor computeDevice)
Evaluates the Function using the specified input. It computes the outputs of the Function based on the Values provided for each input variable specified in the inputs
dictionary. The outputs are stored in the output Values corresponding to the output variables in the outputs
dictionary.
Parameters:
inputs
: the input variables and their values of the Function.outputs
: output values for each output variable. The caller may specify the Value object for storing the output or passnull
in which case the method allocates the storage for the output results. In both cases, on return the Value object contains the result of the corresponding output of the Function. If anull
Value was specified, and the parametercreatePersistentOutputValues
is not specified or is set tofalse
, the Value object returned by the method is temporary and only guaranteed to be valid until the next Forward/Backward call. If it needs to be accessed later, you should specifycreatePersistentOutputValues
totrue
, or explicitlyDeepClone
the temporary Value object.computeDevice
: the device on which the computation is executed. It should be aligned with the device on which the model is loaded.createPersistentOutputValues
: Only relevant if anull
Value was specified in outputs. If it is set totrue
, the method will create persistent Value objects, otherwise the Value objects are temporary and are only valid until the next Forward/Backward call.
public Function Clone(ParameterCloningMethod parameterCloneMethod = ParameterCloningMethod.Share)
Clones this
Function.
Parameters:
parameterCloneMethod
: specifies how the parameters of Function are cloned:ParameterCloningMethod.Share
- Parameters are shared between the Function being cloned and the new clone. This value should be used if the cloned Function is used for concurrent evaluation.ParameterCloningMethod.Clone
- New learnable Parameters are created and initialized with the current values of the corresponding Parameters of the Function being cloned.ParameterCloningMethod.Freeze
- Parameters are cloned and made immutable; i.e. Constants in the new clone (e.g. for use as a fixed feature extractor). ParameterCloningMethod is defined here.
public Function FindByName(string name, bool nestedSearchInsideBlockFunction)
Finds a function with the given name in the Function graph underlying the Function. If more than one function with the same name exists, an exception is thrown. If nestedSearchInsideBlockFunction is true, search all functions inside block functions too.
Parameters:
name
: the name to be searched for.nestedSearchInsideBlockFunction
: if it is true, all functions inside block functions are also examined.
public IList<Function> FindAllWithName(string name, bool nestedSearchInsideBlockFunction = false)
Finds a list of functions with the given name in the Function graph underlying the Function. If nestedSearchInsideBlockFunction is true, search all functions inside block functions too.
Parameters:
name
: the name to be searched for.nestedSearchInsideBlockFunction
: if it is true, all functions inside block functions are also examined.
public static Function Load(string modelFile, DeviceDescriptor computeDevice)
Loads a Function from a model file.
Parameters:
modelFile
: the path to the model file.computeDevice
: the device on which the Function is loaded.
public static Function Load(byte[] modelBuffer, DeviceDescriptor computeDevice)
Loads a Function from a memory buffer representing a model.
Parameters:
modelBuffer
: the byte array contains the serialized model content.computeDevice
: the device on which the Function is loaded.
public static Function Combine(IEnumerable<Variable> operands)
Creates a new Function instance which combines the outputs of the specified list of 'operands' of Functions. The 'Outputs' of the new 'Function' are union of the 'Outputs' of each of the specified 'operands' Functions. As an example, when creating a classification model, typically the CrossEntropy loss Function and the ClassificationError Function comprise the roots of the computation graph which can be "Combine"d to create a single Function with 2 outputs; viz. CrossEntropy loss and ClassificationError output.
Parameter:
operands
: the list of the functions or variables that should be included in the Outputs of the new function.
public static Function AsComposite(Function rootFunction, string name = "")
Creates a composite Function that has the specified rootFunction as its root. The composite denotes a higher-level Function encapsulating the entire graph of Functions underlying the specified rootFunction.
Parameters:
rootFunction
: the root of the composite function to be created.name
: the name of the composite function to be created.
public static Function Alias(Variable operand, string name = "")
Creates a new Function instance which is just an alias of the specified operand.
Parameters:
operand
: the function or variable that the alias function is created for.name
: the name of the new function to be created.
class Value
A Value
is a multi-dimensional array with an optional mask and is the actual data fed into or produced from a computation.
The following methods create a Value object using dense input with the specified tensor shape.
public static Value CreateBatch<T>(NDShape sampleShape, IEnumerable<T> batch, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a batch of samples. The number of samples in the batch is the number of elements in batch
divided by the size of shape
(A runtime error occurs if the remainder is not zero). The created Value object contains a copy of the specified data in batch
.
Parameters:
sampleShape
: the tensor shape of the Value object.batch
: the data to be contained in the Value object.device
: on which device the Value object should be created.readOnly
: the Value object is read-only if this flag istrue
.
public static Value CreateSequence<T>(NDShape sampleShape, IEnumerable<T> sequence, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a sequence of samples. The created Value object contains a copy of the specified data in sequence
. The sequence length is the number of elements in sequence
divided by the size of shape
(A runtime error occurs if the remainder is not zero). The created sequence is a new sequence.
Parameters:
sampleShape
: the tensor shape of the Value.sequence
: the data to be contained in the Value.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateSequence<T>(NDShape sampleShape, IEnumerable<T> sequence, bool sequenceStartFlag, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a sequence of samples. The created Value object contains a copy of the specified sequence
data. The sequenceStartFlag specifies whether this sequence is a new sequence or continuation of a previous sequence from a previous call to this method. The sequence length is the number of elements in sequence
divided by the size of shape
(A runtime error occurs if the remainder is not zero).
Parameters:
sampleShape
: the tensor shape of the Value.sequence
: the data to be contained in the Value.sequenceStartFlag
:true
indicates that it is a new sequence.false
means a continuation of a previous sequence.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateBatchOfSequences<T>(NDShape sampleShape, IEnumerable<IEnumerable<T>> batchOfSequences, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a batch of variable length sequences. The created Value object contains a copy of the specified data in batchOfSequences
. The number of sequences in the batch is the size of batchOfSequences
. The length of each sequence is the number of elements in the corresponding sequence of batchOfSequences
divided by the size of shape
(A runtime error occurs if the remainder is not zero). Each sequence in batchOfSequences
is a new sequence.
Parameters:
sampleShape
: the tensor shape of the Value.batchOfSequences
: the data to be stored in the Value. The outerIEnumerable
represents a collection of sequences with variable length, and the innerIEnumerable
represents each individual sequence.device
: on which device the Value should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateBatchOfSequences<T>(NDShape sampleShape, IEnumerable<IEnumerable<T>> batchOfSequences, IEnumerable<bool> sequenceStartFlags, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a batch of variable length sequences. The created Value object contains a copy of the specified data in batchOfSequences
. The number of sequences in the batch is the size of batchOfSequences
. The length of each sequence is the number of elements in the corresponding sequence of batchOfSequences
divided by the size of shape
(A runtime error occurs if the remainder is not zero).
Parameters:
sampleShape
: the tensor shape of the Value.batchOfSequences
: the data to be stored in the Value. The outerIEnumerable
represents a collection of sequences with variable length, and the innerIEnumerable
represents each individual sequence.sequenceStartFlags
: A collection of boolean values. Each element represents whether the corresponding sequence inbatchOfSequences
is a new sequence (in case oftrue
) or a continuation of a previous sequence (in case offalse
).device
: on which device the Value should be created.readOnly
: the Value is read-only if this flag istrue
.
The following methods create a Value object using one-hot vector input.
public static Value CreateBatch<T>(int dimension, IEnumerable<int> batch, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a batch of samples. Each sample is represented by an index value that points to the non-zero value in the one-hot vector of dimension
elements. The number of samples in the batch is the number of elements in batch
.
Parameters:
T
: data type of the created Value object. Currently,float
anddouble
are supported.dimension
: the size of dimension of the one-hot vector.batch
: the collection of indexes representing the batch of samples.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateSequence<T>(int dimension, IEnumerable<int> sequence, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a sequence of samples. Each sample is represented by an index value that points to the non-zero value in the one-hot vector of dimension
elements. The sequence length is the number of elements in sequence
. The created sequence is a new sequence.
Parameters:
T
: data type of the created Value object. Currently,float
anddouble
are supported.dimension
: the size of dimension of the one-hot vector.sequence
: the collection of indexes representing the sequence of samples.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateSequence<T>(int dimension, IEnumerable<int> sequence, bool sequenceStartFlag, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a sequence of samples. Each sample is represented by an index value that points to the non-zero value in the one-hot vector of dimension
elements. The sequenceStartFlag specifies whether this sequence is a new sequence or continuation of a previous sequence from a previous call to this method. The sequence length is the number of elements in sequence
.
Parameters:
T
: data type of the created Value object. Currently,float
anddouble
are supported.dimension
: the size of dimension of the one-hot vector.sequence
: the collection of indexes representing the sequence of samples.sequenceStartFlag
:true
indicates that it is a new sequence.false
means a continuation of a previous sequence.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateBatchOfSequences<T>(int dimension, IEnumerable<IEnumerable<int>> batchOfSequences, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a batch of variable length sequences. Each sample is represented by an index value that points to the non-zero value in the one-hot vector of dimension
elements. The number of sequences is the number of elements in the outer collection of batchOfSequences
. The length of each sequence is the number of elements of the corresponding sequence in the collection list of batchOfSequences
. Each sequence in batchOfSequences
is a new sequence.
Parameters:
T
: data type of the created Value object. Currently,float
anddouble
are supported.dimension
: the size of dimension of the one-hot vector.batchOfSequences
: the collection of indexes representing sequences of samples. The outerIEnumerable
represents a collection of sequences with variable length, and the innerIEnumerable
represents each individual sequence.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateBatchOfSequences<T>(int dimension, IEnumerable<IEnumerable<int>> batchOfSequences, IEnumerable<bool> sequenceStartFlags, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a batch of variable length sequences. Each sample is represented by an index value that points to the non-zero value in the one-hot vector of dimension
elements. The number of sequences is the number of elements in the outer collection of batchOfSequences
. The length of each sequence is the number of elements of the corresponding sequence in the inner collection of batchOfSequences
.
Parameters:
T
: data type of the created Value object. Currently,float
anddouble
are supported.dimension
: the size of dimension of the one-hot vector.batchOfSequences
: the collection of indexes representing sequences of samples. The outerIEnumerable
represents a collection of sequences with variable length, and the innerIEnumerable
represents each individual sequence.sequenceStartFlags
: A collection of boolean values. Each element represents whether the corresponding sequence inbatchOfSequences
is a new sequence (in case oftrue
) or a continuation of a previous sequence (in case offalse
).device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
The following methods create a Value object using sparse input.
Currently the Compressed Sparse Column Format (CSC) is supported. The CSC format stores the matrix in column-major format, and the array containing the column indices is compressed. A matrix in CSC format is represented by the following parameters:
nonZeroValues
: the data array that holds all nonzero values of the matrix in column-major format.rowIndices
: the array that contains the row indices of the corresponding elements in arraynonZeroValues
.colStarts
: the array that holds indices into the arraysrowIndices
andnonZeroValues
.
A detailed description of the CSC format can be found here.
public static Value CreateSequence<T>(NDShape sampleShape, int sequenceLength, int[] colStarts, int[] rowIndices, T[] nonZeroValues, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a sequence of samples using CSC sparse input format. The sequence length is the number of rows of the sparse matrix. The created sequence is a new sequence.
Parameters:
T
: data type of the created Value object. Currently,float
anddouble
are supported.sampleShape
: the tensor shape of the Value. For sparse input, the tensor shape leading dimensionality must be the same as the total size of the tensor shape.sequenceLength
: the sequence length, which is also the number of rows in the sparse matrix.colStarts
: the array holds indices for each column into the arraysrowIndices
andnonZeroValues
.rowIndices
: the array that contains the row indices of the corresponding elements in arraynonZeroValues
.nonZeroValues
: the array that holds all nonzero values in the sparse matrix.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateSequence<T>(NDShape sampleShape, int sequenceLength, int[] colStarts, int[] rowIndices, T[] nonZeroValues, bool sequenceStartFlag, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a sequence of samples using CSC sparse input format. The sequence length is the number of rows of the sparse matrix. The sequenceStartFlag specifies whether this sequence is a new sequence or continuation of a previous sequence from a previous call to this method.
Parameters:
T
: data type of the created Value object. Currently,float
anddouble
are supported.sampleShape
: the tensor shape of the Value. For sparse input, the tensor shape leading dimensionality must be the same as the total size of the tensor shape.sequenceLength
: the sequence length, which is also the number of rows in the sparse matrix.colStarts
: the array holds indices for each column into the arraysrowIndices
andnonZeroValues
.rowIndices
: the array that contains the row indices of the corresponding elements in arraynonZeroValues
.nonZeroValues
: the array that holds all nonzero values in the sparse matrix.sequenceStartFlag
:true
indicates that it is a new sequence.false
means a continuation of a previous sequence.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateSequence<T>(int dimension, int sequenceLength, int[] colStarts, int[] rowIndices, T[] nonZeroValues, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a sequence of samples using CSC sparse input format. The sequence length is the number of rows of the sparse matrix. The created sequence is a new sequence.
Parameters:
T
: data type of the created Value object. Currently,float
anddouble
are supported.dimension
: the number of columns in the sparse matrix.sequenceLength
: the sequence length, which is also the number of rows in the sparse matrix.colStarts
: the array holds indices for each column into the arraysrowIndices
andnonZeroValues
.rowIndices
: the array that contains the row indices of the corresponding elements in arraynonZeroValues
.nonZeroValues
: the array that holds all nonzero values in the sparse matrix.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value CreateSequence<T>(int dimension, int sequenceLength, int[] colStarts, int[] rowIndices, T[] nonZeroValues, bool sequenceStartFlag, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object containing a sequence of samples using CSC sparse input format. The sequence length is the number of rows of the sparse matrix. The sequenceStartFlag specifies whether this sequence is a new sequence or continuation of a previous sequence.
Parameters:
T
: data type of the created Value object. Currently,float
anddouble
are supported.dimension
: the number of columns in the sparse matrix.sequenceLength
: the sequence length, which is also the number of rows in the sparse matrix.colStarts
: the array holds indices for each column into the arraysrowIndices
andnonZeroValues
.rowIndices
: the array that contains the row indices of the corresponding elements in arraynonZeroValues
.nonZeroValues
: the array that holds all nonzero values in the sparse matrix.sequenceStartFlag
:true
indicates that it is a new sequence.false
means a continuation of a previous sequence.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
The following methods create a Value object from NDArrayView.
public static Value Create(NDShape sampleShape, IEnumerable<NDArrayView> sequences, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object based on a collection of NDArrayViews. Each sequence in sequences
is a new sequence.
Parameters:
sampleShape
: the tensor shape of the Value being created.sequences
: a collection of sequences represented by NDArrayView. Each NDArrayView represents a sequence.device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
public static Value Create(NDShape sampleShape, IEnumerable<NDArrayView> sequences, IEnumerable<bool> sequenceStartFlags, DeviceDescriptor device, bool readOnly = false)
Creates a new Value object based on a collection of NDArrayViews. The sequenceStartFlags specifies whether a sequence is a new sequence or continuation of a previous sequence.
Parameters:
sampleShape
: the tensor shape of the Value being created.sequences
: a collection of sequences represented by NDArrayView. Each NDArrayView represents a sequence.sequenceStartFlags
: A collection of boolean values. Each element represents whether the corresponding sequence insequences
is a new sequence (in case oftrue
) or a continuation of a previous sequence (in case offalse
).device
: on which device the Value object should be created.readOnly
: the Value is read-only if this flag istrue
.
A Value object contains the following properties and methods.
public Value(NDArrayView data)
Constructs a multi-dimensional value with no mask.
public Value(NDArrayView data, NDMask mask)
Constructs a multi-dimensional value with an associated mask.
public DataType DataType { get; }
DataType of the data contained in the Value object.
public DeviceDescriptor Device { get; }
The descriptor of the device that the Value resides on.
public NDShape Shape { get; }
The shape of the Value.
public StroageFormat StorageFormat { get; }
The storage format of the Value.
public bool IsSparse { get; }
A boolean value indicating whether the Value contains data in sparse storage format.
public bool IsReadOnly { get; }
A boolean value indicating whether the Value is read-only.
public int maskedCount { get; }
The number of masked/invalid values in the Value.
public void CopyFrom(Value Source)
Copies the contents of source
to the Value. The shapes of the Source
's data and mask must be identical to this
Value's data and mask.
Parameter:
Source
: The source object from which the Value is copied.
public Value DeepClone()
Creates a new Value with newly allocated storage on the same device as this
Value and copies this
Value's contents into the newly allocated Value.
public Value DeepClone(bool readOnly)
Creates a new Value with newly allocated storage on the same device as this
Value and copies this
Value's contents into the newly allocated Value.
Parameter:
readOnly
: the new Value object is read-only if this flag istrue
.
public Value Alias(bool readOnly)
Creates a new Value which is an alias of this
Value.
Parameter:
readOnly
: the new Value object is read-only if this flag istrue
.
public IList<IList<T>> GetDenseData<T>(Variable outputVariable)
Gets the data stored in the Value object as a list of sequences with variable length in dense format. This method returns an IList<IList>. Each element of the outer list represents a sequence. Each sequence, represented by IList, contains a variable number of samples. Each sample consists of a fixed number of elements with type of 'T'. The number of elements is determined by the shape of outputVariable. The number of samples is the count of elements in IList divided by the count of elements of the sample.
Parameter:
outputVariable
: The variable that the Value denotes to. The shape of the variable should match the shape of the Value.
public IList<IList<int>> GetOneHotData(Variable outputVariable)
Gets the data stored in the Value object as a list of sequences with variable length in one-hot vector format. This method returns an IList<IList>. Each element of the outer list represents a sequence. Each sequence, represented by IList, contains a variable number of samples. Each sample is represented by an index to the one-hot vector. The number of samples is the count of elements in IList.
Parameter:
outputVariable
: The variable that the Value denotes to. The size of the one-hot vector should match that defined in the variable.
public void GetSparseData<T>(Variable outputVariable, out int sequenceLength, out IList<int> colStarts, out IList<int> rowIndices, out IList<T> nonZeroValues, out int numNonZeroValues)
Copy the data stored in the Value object to the buffers representing a sequence in CSC sparse format. The sequence buffer will be resized if necessary. The Value should have the same tensor shape as outputVariable. On return, sequenceLength
is set to the length of the sequence stored in the Value, and colStarts
, rowIndices
and nonZeroValues
contain the data of column start indexes, row indexes and non-zero values, and numNonZeroValues
is set to number of non-zero values contained in this
Value.
Parameters:
outputVariable
: denotes the shape and dynamic axes when copying data from this Value to the buffers.sequenceLength
: on return, it is set to the length of the sequence stored in the Value.colStarts
: on return, it contains indices into thenonZeorValues
of the first non-zero element of each column of the matrix.rowIndices
: on return, it contains the row indexes of each non-zero element of the matrix.nonZeroValues
: on return, it contains values of all non-zero elements of the matrix.numNonZeroValues
: on return, it returns the number of non-zero elements of the matrix.
The following methods will be deprecated soon. Please use GetDenseData() and GetOneHotData() described above.
public void CopyVariableValueTo<T>(Variable outputVariable, List<List<T>> sequences)
Copies the data stored in the Value into the buffer provided by sequences
. The sequences
is a list of sequences with variable length. The number of items contained in the outer list of sequences
is the number of sequences in the Value. Each element of the outer list represents a sequence. Each sequence, represented by List<T>
, contains a variable number of samples. Each sample consists of a fixed number of elements with type of T
. The number of elements of a sample is determined by the shape of outputVariable
. The shape of the variable should match the shape of the Value.
Parameters:
outputVariable
: denotes the shape and dynamic axes when copying data from the Value to thesequences
.sequences
: the output buffer used to store the data copied from the Value.
public void CopyVariableValueTo(Variable outputVariable, List<List<uint>> sequences
Copies the data stored in the Value object into the buffer provided by sequences
. The sequences
is a list of sequences with variable length. The number of items contained in the outer list of sequences
is the number of sequences in the Value. Each element of the outer list represents a sequence. Each sequence, represented by List<uint>
, contains a variable number of samples. Each sample is represented by an index pointing to the non-zero value in the one-hot vector. The dimension size of the one-hot vector should match that defined in the outputVariable
.
Parameters:
outputVariable
: denotes the shape and dynamic axes when copying data from the Value to thesequences
.sequences
: the output buffer used to store the data copied from the Value.
class Variable
Denotes a symbolic entity corresponding to the inputs and outputs of a Function
.
The properties of Variable
that are often used in evaluation include:
public string Name { get; }
Name of the Variable.
public NDShape Shape { get; }
Shape of the Variable.
public DataType DataTye { get; }
DataType(#enum-datatype) of the data that the Variable represents.
public VariableKind Kind { get; }
The VariableKind of the Variable.
public bool IsSparse { get; }
A boolean value indicating whether the Variable denotes sparse data.
public bool IsInput { get; }
A boolean value indicating whether the Variable is an Input.
public bool IsOutput { get; }
A boolean value indicating whether the Variable is an Output.
public bool IsParameter { get; }
A boolean value indicating whether the Variable is a Parameter.
public bool IsConstant { get; }
A boolean value indicating whether the Variable is a Constant.
public bool IsPlaceholder { get; }
A boolean value indicating whether the Variable is a Placeholder.
public IList<Axis> DynamicAxes { get; }
Returns the dynamic axes of the Variable.
public Function Owner { get; }
Returns the Function which the Variable is an output of. Returns null
when the Variable is not of VariableKind Output.
class DeviceDescriptor
Denotes a computation device instance.
The class DeviceDescriptor
contains the following properties and methods:
public int Id { get; }
The Id of the device.
public DeviceKind Type { get; }
DeviceKind of the device.
public static DeviceDescriptor CPUDevice { get; }
The DeviceDescriptor representing the CPU device on the local system.
public static DeviceDescriptor GPUDevice(int deviceId)
Gets the DeviceDescriptor of the GPU device on the local system with the specified CUDA device ID.
Parameter:
deviceId
: the CUDA device ID.
public static IList<DeviceDescriptor> AllDevices()
Gets a list of descriptors of all available/supported devices.
class NDShape
Denotes a multi-dimensional rectangular shape.
public NDShape()
Constructs a NDShape with 0 axes, which denotes a scalar.
public NDShape(int numAxes, int dimension)
Constructs a NDShape instance with the specified rank and dimension size. Each axis has the same dimensionality.
Parameters:
numAxes
: the number of axes of the shape.dimension
: the dimension size, applied to each axis.
public NDShape(int numAxes)
Constructs a NDShape instance with the specified rank. The dimensionality in each axis is NDShape.InferredDimension
.
Parameter:
numAxes
: the number of axes of the shape.
public static NDShape CreateNDShape(IEnumerable<int> dimensions)
Creates a NDShape instance with specified dimensions. Parameter:
dimensions
: the dimension size of each axis.
public int Rank { get; }
The rank of the NDShape.
public IList<int> Dimensions { get; }
The dimensions of the NDShape.
public int TotalSize { get; }
The total size of the rectangular shape that the Shape denotes.
public int this[int key] { get; }
Returns the dimension size of the specified axis.
public int IsUnknown { get; }
A boolean indicating if the shape is the special Unknown shape.
public int HasInferredDimension { get; }
A boolean value indicating if the dimension size for any of the axes of the shape is unknown/inferred (NDShape.InferredDimension).
public NDShape AppendShape(NDShape shape)
Creates and returns a new shape constructed by appending the dimensions of the specified 'shape' to this
shape's dimensions.
public NDShape SubShape(int beginAxisId, int endAxisId)
Creates and returns a new NDShape instance with the same dimensions as this
shape's specified axis range [beginAxisId, endAxisId).
public NDShape SubShape(int beginAxisId)
Creates and returns a new NDShape instance with the same dimensions as this
shape's axis range between the beginAxisId axis (inclusive) and the last axis (inclusive).
class NDArrayView
Denotes a multi-dimensional writable or read-only array of elemental values. This type denotes a view and there may be multiple simultaneous views of the data underlying a NDArrayView instance. The underlying data is stored in sparse or dense format, and is located on a specific device.
public NDArrayView(NDShape viewShape, float[] dataBuffer, DeviceDescriptor device, bool readOnly = false)
public NDArrayView(NDShape viewShape, double[] dataBuffer, DeviceDescriptor device, bool readOnly = false)
Constructs a NDArrayView with the specified 'dataBuffer' in dense format as the backing storage on the specified device.
Parameters:
viewShape
: the shape of the NDArrayView being created.dataBuffer
: the data values contained in the NDArrayView. The 'dataBuffer' must be at least as large as the total size of the specified 'viewShape' and must outlive the created NDArrayView object.device
: on which device the NDArrayView object should be created.readOnly
: the NDArrayView object is read-only if this flag istrue
.
public NDArrayView(NDShape viewShape, int[] colStarts, int[] rowIndices, float[] nonZeroValues, DeviceDescriptor device, bool readOnly = false)
public NDArrayView(NDShape viewShape, int[] colStarts, int[] rowIndices, double[] nonZeroValues, DeviceDescriptor device, bool readOnly = false)
Constructs a NDArrayView with the specified storage in sparse CSC format on the specified device. The specified sparse data must outlive the created NDArrayView object.
Parameters:
viewShape
: the shape of the NDArrayView being created.colStarts
: the array holds indices for each column into the arraysrowIndices
andnonZeroValues
.rowIndices
: the array that contains the row indices of the corresponding elements in arraynonZeroValues
.nonZeroValues
: the array that holds all nonzero values in the sparse matrix. The specified sparse data must outlive the created NDArrayView object.device
: on which device the NDArrayView object should be created.readOnly
: the NDArrayView object is read-only if this flag istrue
.
public DeviceDescriptor Device
The DeviceDescriptor of the device that the NDArrayView resides on.
public NDShape Shape
The shape of the NDArrayView.
public DataType DataType
The DataType of the data that the NDArrayView stores.
public StroageFormat StorageFormat
The storage format of the NDArrayView.
public bool IsSparse
A boolean value indicating whether the NDArrayView contains data in sparse storage format.
public bool IsReadOnly`
A boolean value indicating whether the NDArrayView is read-only.
***
```cs
public NDArrayView DeepClone()
Creates a new NDArrayView with newly allocated storage on the same device as this
view and copies this
view's contents into the newly allocated view.
public NDArrayView DeepClone(bool readOnly)
Creates a new NDArrayView with newly allocated storage on the same device as this
view and copies this
view's contents into the newly allocated view.
Parameter:
readOnly
: the new NDArrayView object is read-only if this flag istrue
.
public NDArrayView DeepClone(DeviceDescriptor device, bool readOnly)
Creates a new NDArrayView with newly allocated storage on the specified device and copies this
view's contents into the newly allocated view.
Parameters:
device
: on which device the new NDArrayView object should be created.readOnly
: the new NDArrayView object is read-only if this flag istrue
.
public NDArrayView Alias(bool readOnly)
Creates a new NDArrayView which is an alias of this
view; i.e. a new view of the same shape as this
over the same underlying data.
Parameter:
readOnly
: the new NDArrayView object is read-only if this flag istrue
.
public NDArrayView AsShape(NDShape newShape)
Creates a new NDArrayView which is an alias of this
view but with a new shape.
Parameter:
newShape
: the shape of the new NDArrayView object.
public void CopyFrom(NDArrayView source)
Copies the contents of the 'source' NDArrayView to this
view. The shapes of the 'source' view and this
view must be identical.
Parameter:
source
: the source NDArrayView whose content is copied tothis
view.
public void ChangeDevice(DeviceDescriptor device)
Changes the device of the NDArrayView to the specified device.
Parameter:
device
: the target device of the NDArrayView object.
class NDMask
Denotes a multi-dimensional mask used for specifying specific sections of a NDArrayView object as masked/invalid. This type denotes a view and there may be multiple simultaneous views of the data underlying a NDMask instance.
public NDMask(NDShape shape, DeviceDescriptor device)
Construct a new Mask object of specified shape on the specified device.
Parameters:
shape
: the shape of the NDMask object.device
: the target device of the MDMask object.
public int MaskedCount { get; }
The number of masked/invalid values.
public int Device { get; }
The descriptor of the device that the mask resides on
public int Shape { get; }
The shape of the mask.
public void InvalidateSection(IEnumerable<int> sectionOffset, NDShape sectionShape)
Mask the specified sub-section as invalid.
Parameters:
sectionOffset
: A list specifying start positions of the section that should be masked as invalid.sectionShape
: The shape describes the section that should be masked as invalid.
public void MarkSequenceBegin(IEnumerable<int> offset)
Mark the specified position as sequence begin.
Parameter:
sectionOffset
: A list specifying start positions in the mask that should be masked as sequence begin.
public void MarkSequenceBegin(IEnumerable<int> offset, NDShape sectionShape)
Mark the specified sub-section as sequence begin.
Parameters:
offset
: A list specifying start positions of the section that should be masked as sequence begin.sectionShape
: The shape describes the section that should be masked as sequence begin.
public void Clear()
Clear the mask. All currently values masked as invalid are set to valid.
public NDMask DeepClone(DeviceDescriptor device)
Creates a new NDMask with newly allocated storage on the specified device and copies this
mask's contents into the newly allocated view.
Parameter:
device
: the target device of the MDMask object.
public NDMask DeepClone()
Creates a new NDMask with newly allocated storage on the same device as this
mask and copies this
mask's contents into the newly allocated mask.
public NDMask Alias()
Creates a new NDMask which is an alias of this
mask.
public void CopyFrom(NDMask source)
Copies the contents of the source
NDMask to this
mask. The shapes of the source
mask and this
mask must be identical.
Parameter:
source
: the source NDMask whose content is copied tothis
view.
class Axis
Denotes an Axis of a Variable
. Besides the static axes corresponding to each of the axes of the Variable's shape, Variables of kind 'Input' and any 'Output' Variables dependent on an 'Input' Variable also have 2 additional dynamic axes whose dimensions are known only when the Variable is bound to actual data during compute (viz. sequence axis and batch axis denoting the axis along which multiple sequences are batched)
The following properties are defined in the class Axis
public string Name { get; }
Name of the Axis.
public bool IsStatic { get; }
Returns a boolean value indicating whether the Axis corresponds to a static axis.
public bool IsDynamic { get; }
Returns a boolean value indicating whether the Axis corresponds to a dynamic axis.
class Utils
public static void SetMaxNumCPUThreads(int numCPUThreads)
Sets the process-wide maximum number of CPU threads to be used by any individual compute operation.
public static int GetMaxNumCPUThreads()
Returns the process-wide maximum number of CPU threads to be used by any individual compute operation.
public static void SetTraceLevel(TraceLevel value)
Specifies global logging verbosity level.
public static TraceLevel GetTraceLevel()
Returns current logging verbosity level.
enum VariableKind
Denotes the kind of a symbolic Variable
object
enum VariableKind { Input, Output, Parameter, Constant, Placeholder };
enum DataType
Denotes data type of symbolic data entities or actual data.
enum DataType { Unknown, Float, Double };
enum DeviceKind
Denotes the type of a computation device.
enum DeviceKind { CPU, GPU };
enum StorageFormat
Denotes the format of storage underlying an instance of a NDArrayView.
enum StorageFormat { Dense, SparseCSC, SparseBlockCol };
enum ParameterCloningMethod
Denotes how Parameters are handled when cloning a Function.
enum ParameterCloningMethod {
Share, // Parameters are shared between the Function being cloned and the new clone.
Clone, // New learnable Parameters are created and initialized with the current values of the corresponding Parameters of the Function being cloned.
Freeze // Parameters are cloned and made immutable.
};
enum TraceLevel
Denotes logging verbosity levels.
enum TraceLevel { Error, Warning, Info };